2011-09-06 35 views
1

我正在使用VS2008與QT 4.7.1和加載項。我對這個環境很陌生。
我設法做必要的設置和運行簡單的「你好世界」。但是當我嘗試使用簡單的 quit()插槽點擊一個按鈕,我失敗了。當試圖使用Q_OBJECT時,它也會導致編譯失敗。
評論後Q_OBJECT代碼被構建和調試。現在它顯示無法找到退出插槽,並使用Q_OBJECT宏

QObject :: connect:no such slot QWidget :: quit()in。\ main.cpp found。下面

是我的代碼

#include <QtGui> 
#include "QtGui\QApplication" 
#include "QObject" 


class Notepad : public QWidget 
{ 
    //Q_OBJECT 
public: 
    Notepad(); 
    private slots: 
     void quit(); 

private: 
    QTextEdit *textEdit; 
    QPushButton *quitButton; 
}; 

Notepad::Notepad() 
{ 
    textEdit = new QTextEdit; 
    quitButton = new QPushButton(tr("Quit")); 
    connect(quitButton, SIGNAL(clicked()), this, SLOT(quit())); 
    QVBoxLayout *layout = new QVBoxLayout; 
    layout->addWidget(textEdit); 
    layout->addWidget(quitButton); 

    setLayout(layout); 

    setWindowTitle(tr("Notepad")); 
} 


int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    Notepad nt;// = new Notepad(); 
    nt.show(); 

    return a.exec(); 
} 

我已經通過網絡搜索,但未能得到合理的解決方案。大多數解決方案都是在命令行上使用qmake。 此外,我能夠找到項目的.pro文件。

任何幫助表示讚賞。

+0

我沒有在你的代碼中看到你的void void Notepad :: quit(){} **方法在任何地方都是正常的。 – KaZ

+0

我希望如此,因爲這不會導致任何錯誤。也不要刪除這個影響代碼! – Nitesh

+0

@KaZ這是問題所在。退出沒有被定義。這不會導致直接的錯誤,但定義Q_OBJECT宏是因爲它無法找到quit()槽的定義。 – Nitesh

回答

1

Nitesh:您需要Q_OBJECT宏槽能夠正常工作,商務部編譯包含Q_OBJECT到moc_ * .cpp文件每頭。添加該moc* .cpp到您的項目,一切都應該正常工作。未解決的外部意味着你錯過了該函數的定義,你是否在任何地方定義了它?

+0

我得到了問題的答案。錯誤是由於Notepad :: quit()方法缺少定義。當我們包含Q_OBJECT宏時,MOC檢查所有插槽或信號,但是如果對它進行註釋,則不會查找退出插槽的定義,因此在這種情況下不會出現錯誤 爲quit()插槽添加定義可解決此問題 Thanks @blueskin – Nitesh

0

移動記事本聲明的標題(比如,notepad.h),重新啓用Q_OBJECT,然後添加到您的.pro文件:

HEADERS += notepad.h 

重新運行qmake的,那麼它應該工作。

+0

我通過VS2008構建代碼而不使用qmake。 此外,我無法在我的projecy目錄中.pro文件。 – Nitesh

+0

我創建了一個單獨的頭文件。然後在啓用Q_OBJECT後重新編譯。 這是我得到的錯誤。 錯誤LNK2019:無法解析的外部符號「private:void __thiscall Notepad :: quit(void)」(?quit @ Notepad @@ AAEXXZ)在函數「public:virtual int __thiscall中引用了記事本:: qt_metacall(枚舉QMetaObject :: Call,int ,void * *)「(?qt_metacall @ Notepad @@ UAEHW4Call @ QMetaObject @@ HPAPAX @ Z) – Nitesh

+0

從您的項目中刪除頭文件(不要刪除它)並將其重新添加回去。這應該會觸發QT的MOC插件並創建缺少的moc_notepad.h文件,其中包含缺少的符號 –