【问题标题】:Qt trigger signal on all instances of a given class给定类的所有实例上的 Qt 触发信号
【发布时间】:2012-10-03 06:03:06
【问题描述】:

Qt 信号通常在 QObject 的特定实例上触发。

有没有办法通过 MetaObjects 在特定类的所有实例上触发它?

或者唯一的方法是维护你自己的所有实例的静态列表,也许通过使用构造函数和析构函数,然后只是 Q_FOREACH 呢?

【问题讨论】:

    标签: qt signals signals-slots metaobject


    【解决方案1】:

    如果不通过QMetaObject 系统调用信号,则不能在定义它们的类之外(或从定义它们的类派生)发出信号:

    QMetaObject::invokeMethod( myObj, "mySignal",
                               Q_ARG( QString, "str" ),
                               Q_ARG( int, 42 ) );
    

    但是似乎没有一种 API 方法可以让所有特定类型的所有对象都发出,我能找到的最接近的是:

    for ( QWidget* widget : QApplication::allWidgets() ) {
        if ( dynamic_cast< myType* >( widget ) ) {
            QMetaObject::invokeMethod( widget, "mySignal",
                                       Q_ARG( QString, "str" ),
                                       Q_ARG( int, 42 ) );
        }
    }
    

    但显然这只适用于QWidget 派生类型,似乎没有QObject 等价类型。

    【讨论】:

      【解决方案2】:

      如何在幕后创建一个单例,并将所有实例连接到来自该单例的信号(信号到信号连接)? 当您希望所有实例都发出信号时,只需让单例发出它,所有实例都会转发它。

      【讨论】:

      • 这实际上是个好主意——比我的全局静态成员变量的概念要好得多。
      猜你喜欢
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 2011-03-12
      • 2021-05-18
      相关资源
      最近更新 更多