2015-02-07 94 views
1

我想將屬性標題添加到我的應用程序的主窗口中。但是,當我嘗試編譯,編譯器給了我這個錯誤:QT未定義的參考信號編譯錯誤

mainwindow.cpp:19: undefined reference to `MainWindow::titleChanged(QString const&)' 

我試圖在MinGW和msvc2013都無法與此錯誤在同一行。頁眉/源文件:

mainwindow.h:

#ifndef MAINWINDOW 
#define MAINWINDOW 

#include <QObject> 
#include <QString> 

class MainWindow : public QObject { 
    QOBJECT_H 

    Q_PROPERTY(QString title READ getTitle WRITE setTitle NOTIFY titleChanged) 

public: 
    MainWindow(); 

    QString getTitle(); 

public slots: 
    void setTitle(const QString& title); 

signals: 
    void titleChanged(const QString& title); 

private: 
    QString title_; 
}; 

#endif // MAINWINDOW 

mainwindow.cpp:

#include "mainwindow.h" 

#include <QString> 

MainWindow::MainWindow() 
{ 
} 

QString MainWindow::getTitle() 
{ 
    return title_; 
} 

void MainWindow::setTitle(const QString& title) 
{ 
    if (title_ != title) { 
     title_ = title; 

     emit titleChanged(title); 
    } 
} 

如果我添加下面的方法mainwindow.cpp文件的末尾,則該應用程序編譯和運行,但信號不發射:

void MainWindow::titleChanged(const QString&) 
{ 
} 

我試圖清理項目的bu ild文件夾,它沒有幫助:(。我正在使用QT 5.4並在QT Creator上工作。

+3

'QOBJECT_H'?改爲嘗試'Q_OBJECT'。 – Mat 2015-02-07 18:58:57

+1

之後不要忘記運行'qmake'。 (QtCreator應該自動執行此操作,但以防萬一...) – Zeta 2015-02-07 19:00:08

+0

QMainWindow沒有任何titleChanged方法。 – 2015-02-07 19:01:32

回答

0

此問題已在其他人的評論中回答。我只想強調答案。在我的情況下,錯誤是在頭文件

mainwindow.h:

class MainWindow : public QObject { 
    QOBJECT_H // This should be Q_OBJECT 

... 

我迷糊中QObject.h頭文件作爲與Q_OBJECT宏的包括警衛通過Qt的MOC工具中使用的QOBJECT_H宏。由於intellisense會爲您提供兩種選擇,因此很容易混淆。

我還新指出,有關的常見問題與信號/插槽值得閱讀一個良好的閱讀:My signal/slot connection does not work