Qt在给定类的所有实例上触发信号

时间:2012-10-12 12:10:53

标签: qt signals signals-slots metaobject

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

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

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

2 个答案:

答案 0 :(得分:3)

信号不能在定义它们的类之外发出(或者从定义它们的类派生)而不通过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等效项。

答案 1 :(得分:1)

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