我在Qt5中有一个程序,它只是创建并运行我的类(我认为它必须是一个类才能利用信号/插槽机制,但我不确定这是否与我的特定问题有关):
int main(int argc, char *argv[]) {
MyApp myApp;
return myApp.run(argc, argv);
}
在类本身中,我实例化一个QGuiApplication
,然后尝试捕获它的状态变化信号:
class MyApp : public QObject {
public:
MyApp() { }
~MyApp() { }
int run(int argc, char *argv[]) {
QGuiApplication app(argc, argv);
connect(
app, SIGNAL(applicationStateChanged(Qt::ApplicationState)),
this, SLOT(stateChanged(Qt::ApplicationState)));
// blah blah blah
return app.exec();
}
public slots:
void stateChanged(Qt::ApplicationState newState) {
std::cout << "State changed to " << newState << 'n';
}
};
现在,根据我的理解,这应该将来自QGuiApplication
对象的信号连接到MyApp
对象中的slot函数。但我显然做错了什么,因为它在运行时抱怨信号不存在:
QObject::connect:
No such signal QObject::applicationStateChanged(Qt::ApplicationState)
in Prog.cpp:16
信号名称中的Qobject::
有点令人担忧。我本以为会是QGuiApplication
,但由于我是Qt的新手,我不确定这是否是个问题。
连接该信号的正确方式是什么,这样应用程序状态的变化就会导致调用stateChanged
?
要使信号工作,需要在QObject
派生类的第一个私有部分的开头使用Q_OBJECT
宏。
class MyApp : public QObject {
Q_OBJECT
public:
// ...
}
参见Q_OBJECT
上的问题5.x文档