2016-08-01 74 views
1

我有一个程序在Qt5中,它只是创建和运行我的类(我认为它必须是一个类,利用信号/插槽机制但我不知道这是有关我的具体问题):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'; 
    } 
}; 

现在,从我的理解,这应该c将来自QGuiApplication对象的信号连接到MyApp对象中的插槽功能。但我明明做错事,因为它的抱怨在运行时,信号不存在:

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

在信号名称的Qobject::是有点担心的。我原以为它会是QGuiApplication但是,因为我是这个Qt新手,我不确定这是否是一个问题。

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

+0

这不完全支持建立一个QCoreApplication,顺便之前创建的QObject。你为什么有这种奇怪的封装? – peppe

回答

2

要使信号正常工作,需要在QObject派生类的第一个专用段的开头使用Q_OBJECT宏。

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

Qt 5.x Docs on Q_OBJECT

+0

这使我得到了一个桶编译*时间错误的错误,这个错误的形式没有匹配函数调用'MyApp :: connect(QGuiApplication&,const char *,MyApp *,const char *)''。但看起来这是因为堆栈中的'app'而不是指针。所以,一旦我通过'&app'而不是'app',它就可以正常工作。干杯。 – paxdiablo

+0

您在调用C++编译器之前正在使用MOC编译器,对吗? –