3

我有用于 Windows 的 Qt 库 4.8.1(VS 2010 终极版)和 Qt Visual Studio 插件。这是我非常简单的应用程序:

#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:函数“public: void __thiscall MyClass::setText(类 QString const &)" (?setText@MyClass@@QAEXABVQString@@@Z)

和两个警告:

警告 1 警告 MSB8017:在执行项目“GeneratedFiles\Debug\main.moc”的自定义构建命令时检测到循环依赖项。这可能会导致增量构建无法正常工作。

警告 2 警告:“C:\Users\Anonymous\documents\visual studio 2010\Projects\qtWorld\qtWorld\qtworld.qrc”中没有资源。

我没有使用任何 qmake / nmake 。当您获得最新的 Qt Visual Studio Add-in 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 无法识别它。

感谢@koahnig 提供了很好的解释

于 2012-08-17T08:33:46.857 回答
1

您的类的构造函数未定义,仅声明。方法也一样textChanged()。至少这是我从您发布的代码中看到的。定义它们,错误应该消失。

于 2012-08-14T10:41:43.940 回答