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

Posted

技术标签:

【中文标题】Qt5 信号捕获到插槽生成运行时错误“信号不存在”【英文标题】:Qt5 signal capture to slot generates runtime error "signal does not exist" 【发布时间】:2016-08-01 04:25:37 【问题描述】:

我在 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,但由于我是 Qt 方面的新手,我不确定这是否是个问题。

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

【问题讨论】:

顺便说一句,不完全支持在创建 QCoreApplication 之前创建 QObjects。为什么会有这种奇怪的封装? 【参考方案1】:

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

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

见Qt 5.x Docs on Q_OBJECT

【讨论】:

这给我带来了no matching function for call to ‘MyApp::connect(QGuiApplication&amp;, const char*, MyApp*, const char*)’ 形式的编译 时间错误。但似乎这是因为app 在堆栈中而不是指针。所以,一旦我通过&amp;app 而不是app,它就可以正常工作。干杯。 你是在调用C++编译器之前使用MOC编译器吧?

以上是关于Qt5 信号捕获到插槽生成运行时错误“信号不存在”的主要内容,如果未能解决你的问题,请参考以下文章

信号没有被其他类捕获

QtSerialPort 在错误的线程中实例化,导致信号/插槽失败

IPC信号

Qt QProcess::finished() 信号没有这样的插槽

如何调试 nativescript 抛出“NativeScript 捕获信号 11”。错误?

iOS异常信号的捕获和简单处理