在VS 2008中使用Qt 4.6出现的问题

3

系统信息:win xp SP3,Microsoft Visual Studio 2008 版本号为9.0.21022.8 RTM

Microsoft .NET Framework 版本号为3.5 SP1

Qt插件版本号为1.1.5

我从http://qt.nokia.com/downloads/windows-cpp-vs2008下载并安装了Qt 4.6.3。然后我添加了Qt 1.1.5插件,并配置了PATH变量。

当我打开一个新的QT项目时,默认示例可以正常工作。

在Nokia(qt)网站上,我找到了一些示例,但似乎事情并没有正常工作。

以下是许多不起作用的示例之一:

#include <QtGui>
#include <QWidget>

 class QLabel;
 class QLineEdit; 
 class QTextEdit;


class AddressBook : public QWidget
 {
     Q_OBJECT

 public:
     AddressBook(QWidget *parent = 0);

 private:
     QLineEdit *nameLine;
     QTextEdit *addressText;
 };

AddressBook::AddressBook(QWidget *parent)
     : QWidget(parent)
 {
     QLabel *nameLabel = new QLabel(tr("Name:"));
     nameLine = new QLineEdit;

     QLabel *addressLabel = new QLabel(tr("Address:"));
     addressText = new QTextEdit;

     QGridLayout *mainLayout = new QGridLayout;
     mainLayout->addWidget(nameLabel, 0, 0);
     mainLayout->addWidget(nameLine, 0, 1);
     mainLayout->addWidget(addressLabel, 1, 0, Qt::AlignTop);
     mainLayout->addWidget(addressText, 1, 1);

     setLayout(mainLayout);
     setWindowTitle(tr("Simple Address Book"));
 }

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

     AddressBook addressBook;
     addressBook.show();

     return app.exec();
}

编译器报错如下:

输出窗口

正在链接...

main.obj : error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __thiscall AddressBook::metaObject(void)const " (?metaObject@AddressBook@@UBEPBUQMetaObject@@XZ)

main.obj : error LNK2001: 无法解析的外部符号 "public: virtual void * __thiscall AddressBook::qt_metacast(char const *)" (?qt_metacast@AddressBook@@UAEPAXPBD@Z)

main.obj : error LNK2001: 无法解析的外部符号 "public: virtual int __thiscall AddressBook::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@AddressBook@@UAEHW4Call@QMetaObject@@HPAPAX@Z)

main.obj : error LNK2001: 无法解析的外部符号 "public: static struct QMetaObject const AddressBook::staticMetaObject" (?staticMetaObject@AddressBook@@2UQMetaObject@@B)

C:\Documents and Settings\nik\My Documents\Visual Studio 2008\Projects\vs_03\Debug\vs_03.exe : fatal error LNK1120: 4 unresolved externals

结果

生成日志已保存在“file://c:\Documents and Settings\nik\My Documents\Visual Studio 2008\Projects\vs_03\vs_03\Debug\BuildLog.htm” vs_03 - 5个错误,0个警告

看起来问题与宏 Q_OBJECT 的使用有关,但我不知道该怎么做才能使它正常工作。

可能是安装错误或...没有头绪。

任何帮助都将不胜感激。


似乎与MOC相关。确保MOC为此示例生成匹配的moc_*.cpp文件。如果是,请确保将moc_*.cpp文件添加到项目中。 - stinky472
你有使用过VS2008-Qt的经验吗?你能简单地解释一下几个步骤吗? - nik_02
抱歉,不好意思。我大部分的工作都是通过命令行完成的,所以我的建议与Timo的类似。 - stinky472
3个回答

1
我认为这不是安装问题 - 我假设您正在使用Visual Studio构建项目,在这种情况下,您还需要告诉它构建应该为AddressBook类生成的_moc.cpp文件。
如果它们没有被生成,您还需要在AddressBook的头文件上运行moc。

  1. 下载并安装Qt Visual Studio插件,将Qt插件安装到Visual Studio中(插件支持2005和2008版本)。
  2. 启动Visual Studio。
  3. 选择菜单Qt | 配置Qt版本。添加c:\qt\4.6.3。
  4. 现在Qt已经完全可用,您可以使用VS2005/2008构建Qt应用程序。
根据所述,似乎这是由VS自动完成的。但不确定!
- nik_02
@nik_02 - 你看到的错误是当 _moc.cpp 文件没有生成或编译时典型的错误。我使用 VS2008 来构建 QT 应用程序,但我没有使用插件,所以可能会有些不同。尽管如此,你需要检查这些文件是否已经生成和编译,以消除链接错误。 - Timo Geusch

1

每当您需要让 moc 运行在您的文件上,而且您的类没有单独的头文件和实现文件时,您需要在文件末尾添加 #include "FILENAME.moc"。如果您在 main 函数之后添加了这个,一切都应该正常工作。

您可以通过进入项目目录并执行以下操作来测试此功能:

  • 删除可能存在的任何 makefiles
  • 运行 Visual Studio 命令提示符
    • 运行 qmake -project 以生成项目文件
    • 运行 qmake 以生成 makefiles
    • 运行 nmake 以构建项目

像上面那样简单的项目上,nmake 命令应该完全成功并且没有链接错误。对于更复杂的项目,您可能需要修改 .pro 文件以包括 Qt 的 WebKit 或以其他方式使默认情况下不可用的选项可用。

另一种选择是将 AddressBook 类的定义移动到具有适当实现(cpp/cxx)文件的头文件中。


与此同时,我从(构建自己的)版本安装了Qt,并且一切都按预期工作。这是我的错,因为我最初使用的是预构建版本的Qt。谢谢。 - nik_02
我一直使用预构建的(商业)Qt 版本而没有遇到任何问题。只要预构建版本与您的编译器匹配(即 MSVC vs. GCC),您就不应该有任何问题。 - Kaleb Pederson

0

我找到了解决方案。

在此页面上阅读有关安装的所有详细信息 >>

http://dcsoft.wordpress.com/?aspxerrorpath=/community_server/blogs/dcsoft/archive/2009/03/06/how-to-setup-qt-4-5-visual-studio-integration.aspx

经过一整天的学习和配置,我终于成功地在VS 2008上启用了QT 4.6.3。按照详细的说明进行操作,就不会出现问题。

我的问题是我使用了以下选项:

从Qt 4.6开始,LGPL版本现在已经为Visual Studio 2008 RTM预构建。如果符合您的需求,您可以简单地安装它并跳过“安装Visual Studio插件”。

在我的情况下,这是错误的,所以我转到下一章节:

下载QT源代码

由于当前诺基亚网站上仅下载Qt源代码的选项有些难以理解,请按照以下说明操作:.................................................................................................................................................................................................................................等。请在网站上继续阅读。

目前一切都很顺利。链接中没有错误。MOC运行良好...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接