2012-08-14 54 views
2

我有Qt Visual Studio加載項的Windows Qt庫4.8.1(VS 2010終極版)。這是我非常簡單的應用程序:建立qt解決方案時未解決的外部和一些警告

#include<qobject.h> 
#include<qstring.h> 
#include<memory> 

class MyClass : public QObject{ 
Q_OBJECT 

public: 
MyClass(const QString &text, QObject *parent = 0) : m_text(text) {} 

public slots: 
void setText(const QString &text); 

signals: 
void textChanged(const QString&); 

private: 
QString m_text; 
}; 

void MyClass::setText(const QString &text){ 
if(m_text == text) return; 
m_text = text; 
emit textChanged(m_text); 
} 

int main(int argc, char *argv[]){ 
    std::shared_ptr<MyClass> a(new MyClass("foo")); 
    std::shared_ptr<MyClass> b(new MyClass("bar")); 

QObject::connect(a.get(), SIGNAL(textChanged(const QString&)), 
b.get(), SLOT(setText(const QString&))); 
a->setText("changed"); 
} 

錯誤,我得到有關解析的外部錯誤:6錯誤LNK2001: 解析的外部符號「市民:虛擬INT __thiscall MyClass的:: qt_metacall(枚舉QMetaObject ::呼叫,INT,無效*。*) 「 (qt_metacall @ MyClass的@@ UAEHW4Call @ QMetaObject @@ HPAPAX @ Z)

錯誤4錯誤LNK2001:無法解析的外部符號」 市民:虛擬 結構QMetaObject常量* __thiscall MyClass的:: metaObject(void)const「 (?metaObject @ MyClass @@ UBEPBUQMeta對象@@ XZ)

錯誤5錯誤LNK2001:無法解析的外部符號 「市民:虛擬 無效* __thiscall MyClass的:: qt_metacast(字符常量*)」? (qt_metacast @ MyClass的@@ UAEPAXPBD @ Z)

錯誤3錯誤LNK2019:無法解析的外部符號「protected:void __thiscall MyClass :: textChanged(class QString const &)」(?textChanged @ MyClass @@ IAEXABVQString @@@ Z)在函數 中引用「public:void __thiscall MyClass: :setText(class QString const &)「 (?setText @ MyClass @@ QAEXABVQString @@@ Z)

和兩個警告:

警告1個警告MSB8017:執行自定義生成項目 「GeneratedFiles \調試\ main.moc」 命令的循環依賴關係已經檢測 。這可能會導致增量構建到 工作不正確。

警告2警告: 'C:\ Users \ Anonymous \ documents \ visual studio 2010 \ Projects \ qtWorld \ qtWorld \ qtworld.qrc'中沒有資源。

我沒有使用任何qmake/nmake。當你獲得最新的Qt Visual Studio加載項1.1.11(甚至Intellisense識別關鍵字slots:signals:)時,它們不是必需的,對吧?

現在我的問題:

  1. 我聽到很多錯誤是由剛剛重建整體解決方案,這是爲什麼解決?
  2. 請解釋爲什麼我會深入瞭解這些錯誤及其可能的解決方案。

P.S請善於解釋,不要whorer

回答

4

如果您在cpp文件中定義了QObject類,那麼您還應該爲該文件包含moc。 例如你的MyClass的在main.cpp中定義,那麼你應該增加

#include "main.moc" 

來結束你的main.cpp文件。

感謝@Tomma提供的不明原因的答案:P

解釋爲什麼上面的代碼不工作:

然而,商務部通常只應用於頭文件。由於您的類定義是主程序文件的一部分,因此IDE無法識別它。

感謝@koahnig提供很好的解釋

1

類的構造函數沒有定義,只是聲明代表。對於textChanged()方法同樣如此。至少這是我從你發佈的代碼中看到的。定義它們,錯誤應該消失。

+0

MOC應該創建實現了信號框TextChanged() – drescherjm 2012-08-14 10:56:54

+0

所以這就是爲什麼該警告顯示出來。 – 2012-08-14 10:58:20

+0

'textChanged'是信號,怎麼定義它? 。儘管我現在定義了構造函數,但仍然給出了相同的警告和錯誤。請再次閱讀我的問題請 – 2012-08-14 11:11:08