0

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

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

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

4

2 回答 2

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等价物。

于 2012-10-12T12:40:11.637 回答
1

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

于 2012-10-13T07:26:37.707 回答