首页 文章

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

提问于
浏览
1

我在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 对象中的槽函数 . 但是我在运行时抱怨信号不存在:

QObject::connect:
    No such signal QObject::applicationStateChanged(Qt::ApplicationState)
        in Prog.cpp:16

信号名称中的 Qobject:: 有点担心 . 我本以为会是 QGuiApplication 但是,因为我不确定这是不是问题 .

连接该信号的正确方法是什么,以便应用程序状态的更改会导致 stateChanged 被调用?

1 回答

  • 2

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

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

    Qt 5.x Docs on Q_OBJECT

相关问题