Qt5信号捕获到插槽会产生运行时错误"信号不存在"

时间:2016-08-01 04:25:38

标签: qt5 signals-slots

我在Qt5中有一个程序,它只是创建并运行我的类(我认为它必须是一个类来利用信号/插槽机制但是我不确定& #39;与我的具体问题相关):

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被调用?

1 个答案:

答案 0 :(得分:2)

要使信号起作用,需要在Q_OBJECT派生类的第一个私有部分的开头使用QObject宏。

class MyApp : public QObject {
  Q_OBJECT
  public:
    // ...
}

请参阅Qt 5.x Docs on Q_OBJECT