繁体   English   中英

带有cmake的Visual Studio 2013中的Qt-如何使它工作?

[英]Qt in Visual Studio 2013 with cmake - how do I get this to work?

我目前正在尝试将库Qt集成到我的C ++项目中。 首先,我认为我可以像使用其他任何库一样使用它。 我下载了它,在我的VS项目中添加了include路径和库,并尝试了一小段代码示例,该示例仅创建了一个带有文本编辑和按钮的简单窗口。 这可以正常工作,并且显示了小的用户界面。

现在,我开始尝试实现一个从QWidget派生并实现的类,它可能不是那么简单。 我尝试创建的类如下所示:

#include <QtWidgets\qstylepainter.h>
#include <QtWidgets\qwidget.h>

class MapRenderer : public QWidget{
    Q_OBJECT
public:
    MapRenderer(QWidget *parent = 0);
protected:
    void paintEvent(QPaintEvent* event);
};

和相应的cpp文件:

MapRenderer::MapRenderer(QWidget *parent) : QWidget(parent){
}

void MapRenderer::paintEvent(QPaintEvent *event){
    QPainter p(this);
    p.setPen(QPen(Qt::black, 3));
    p.drawPoint(QPointF(10, 20));
}

现在,当我尝试编译此链接时,我开始出现以下三个链接器错误:

error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __cdecl MapRenderer::metaObject(void)const " (?metaObject@MapRenderer@@UEBAPEBUQMetaObject@@XZ)   G:\Documents\C++ Projects\HistoricalBorders\MapRenderer.obj
error LNK2001: unresolved external symbol "public: virtual void * __cdecl MapRenderer::qt_metacast(char const *)" (?qt_metacast@MapRenderer@@UEAAPEAXPEBD@Z)
error LNK2001: unresolved external symbol "public: virtual int __cdecl MapRenderer::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@MapRenderer@@UEAAHW4Call@QMetaObject@@HPEAPEAX@Z)

因此,我在互联网上浏览了一下,发现Qt显然比带有“正常”库的“正常” c ++项目所需的构建过程复杂得多。 我阅读了qmake和可用于在Visual Studio中创建Qt项目的Visual Studio Qt加载项。

因此,我尝试了一下并安装了Visual Studio加载项,并在其设置中指定了Qt版本的根目录。 之后,我的项目仍然无法编译,但是唯一的错误消息是:

错误LNK1112:模块机器类型“ x64”与目标机器类型“ X86”冲突

现在我还不太了解,因为我的Qt库是64位的,而我的项目配置也是64位的,以及我正在使用的所有其他库。 此外,在安装外接程序之前,我没有这个问题。 我不得不说,我的项目是一个“普通” Visual Studio C ++控制台应用程序。 我看到由于安装了VS加载项,因此在Visual Studio中创建新项目时也可以选择“ Qt控制台应用程序”。 我也尝试了一下,但是创建后甚至没有编译。 我也真的不知道“ Qt项目”与普通的VS项目有什么区别,除了默认情况下包含Qt库。

我不得不提到的另一件事是我使用cmake创建我的VS项目文件,因为我使用了版本控制(Mercurial),并且多个人将在该项目上工作。

目前,我对如何使该库正常工作完全感到困惑。

现在我的问题是什么? 老实说,我真的不知道。 我问自己:

  • 体系结构不匹配链接器错误从何而来?
  • 我可以创建一个普通的VS控制台应用程序并将其与Qt一起使用吗?
  • “ Qt控制台应用程序”与普通VS项目有什么区别?
  • 是否可以使用cmake生成与Qt兼容的VS项目?

编辑:现在我再次卸载了该加载项,重新安装了它,但是现在又又收到了旧的链接器错误(不再是体系结构不匹配)。 我不知道为什么。

编辑:好的,一些澄清。 是的,我要使用cmake。 我也已经有一个cmakelists.txt和一个我自己写的findQt.cmake,它要求您提供Qt根目录,然后向项目添加必要的包含路径和库路径。 到目前为止,这也有效。 例如,以下代码可以毫无问题地编译并显示一个接口:

QApplication app(argc, argv);
QTextEdit *textEdit = new QTextEdit;
QPushButton *quitButton = new QPushButton("&Quit");

QObject::connect(quitButton, SIGNAL(clicked()), qApp, SLOT(quit()));

QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(textEdit);
layout->addWidget(quitButton);
QWidget window;
window.setLayout(layout);
window.show();
app.exec();

现在,如果我尝试创建一个如上所示的类( MapRenderer ),我也会得到上面显示的链接器错误。 现在我以为我做错了。 我唯一的问题是。 从您的评论中,德雷舍姆(Drescherjm),我发现我可能错过了Moc步骤(对不起,但我不知道那是什么意思)。

如果您有Qt项目文件( .pro )(或可以通过某种方式获取它),则可以运行

cd <pro_folder>
qmake -tp vc 

通过正确设置的Qt构建过程来(重新)生成Visual Studio项目文件,包括

  • moc (元对象编译器;这就是您现在所缺少的),
  • uic (处理设计师的文件)
  • rcc (资源编译器)。

所有生成的文件将被正确编译和链接。 您甚至不需要AddIn。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM