3

Qt Visual Studioアドインを備えたWindows用のQtライブラリ4.8.1(VS 2010 Ultimate)があります。これは私の非常に単純なアプリです:

#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: 未解決の外部シンボル "public: virtual int __thiscall MyClass::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@MyClass@@UAEHW4Call@QMetaObject @@HPAPAX@Z)

エラー 4 エラー LNK2001: 未解決の外部シンボル "public: virtual struct QMetaObject const * __thiscall MyClass::metaObject(void)const " (?metaObject@MyClass@@UBEPBUQMetaObject@@XZ)

エラー 5 エラー LNK2001: 未解決の外部シンボル "public: virtual void * __thiscall MyClass::qt_metacast(char const *)" (?qt_metacast@MyClass@@UAEPAXPBD@Z)

エラー 3 エラー LNK2019: 未解決の外部シンボル "保護: void __thiscall MyClass::textChanged(class QString const &)" (?textChanged@MyClass@@IAEXABVQString@@@Z) 関数で参照されている "public: void __thiscall MyClass::setText( class QString const &)" (?setText@MyClass@@QAEXABVQString@@@Z)

および 2 つの警告:

警告 1 警告 MSB8017: 項目 "GeneratedFiles\Debug\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. これらのエラーが詳細に発生する理由と、考えられる解決策を説明してください。

ps 説明を上手にしてください。売春婦にならないでください

4

2 に答える 2

4

cpp ファイルに QObject クラスが定義されている場合は、そのファイルに moc も含める必要があります。たとえば、 MyClass が main.cpp で定義されている場合は、追加する必要があります

#include "main.moc"

main.cpp ファイルの最後まで。

説明のつかない答えを提供してくれた@Tommaに感謝します:P

上記のコードが機能しなかった理由の説明:

ただし、moc は通常、ヘッダー ファイルにのみ適用されます。クラス定義はメイン プログラム ファイルの一部であるため、IDE はそれを認識しません。

素敵な説明を提供してくれた@koa​​hnigに感謝します

于 2012-08-17T08:33:46.857 に答える
1

クラスのコンストラクターは定義されておらず、宣言されているだけです。メソッドについても同じですtextChanged()。少なくともそれは、あなたが投稿したコードから私が見るものです。それらを定義すると、エラーは解消されます。

于 2012-08-14T10:41:43.940 に答える