首页 > 解决方案 > 使用全局 QObject 进行交叉信号/插槽转发是正确的方法

问题描述

我的情况是,一个有很多 QWidget 通信需求的大型 Qt 项目。

例如,我有一个 QPushButton B和一个 QLabel L,我需要单击按钮B以在标签L上显示一些文本或隐藏它等。但问题是它们都无法获取彼此的对象指针,因为两者它们中的一部分位于一棵很深的 QWidget 树中,也许它们的祖祖父小部件是兄弟姐妹,不管怎样。

所以我的选择是创建一个全局唯一的 QObject,仅用于单/插槽转发,如下所示:

class GlobalForward: public QObject
{
    Q_OBJECT
public:
    GlobalForward():QObject(null) {}
signal:
    void SigForwardButton(bool toggle);

}

GlobalForward* gForwardObj;

int main(int argc, char* argv[])
{
    QApplication app(argc, argv[]);

    gForwardObj = new GlobalForward();

    QWidget w;
    QPushButton* button = new QPushButton(&w);

    QWidget m;
    QLabel* label = new QLabel(&m);

    w.show();
    m.show();

    connect(button, &QPushButton::clicked, gForwardObj, &GlobalForward::SigForwardButton);
    connect(gForwardObj, &GlobalForward::SigForwardButton, label, &QWidget::hide);

    return app.exec();
}

实际上,按钮标签相距甚远,彼此看不到。我想使用GlobalForward连接信号以使其工作。此外,它可以类似地转发 QEvent。

我想知道的是,这种方式是否很好地解决了我的问题,它的缺点是什么。另外,任何更好的解决方案都是合适的,谢谢。

标签: c++qtsignals-slotsqobject

解决方案


推荐阅读