2016-08-01 70 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編譯器,對嗎? –