VS2017+Qt5.13.2环境配置
QT安装
1.qt-opensource 与 Visual Studio Add-in 的安装顺序没什么要求
2.Qt选择安装的组件
3.安装完成 Visual Studio Add-in 之后,Visual Studio 就会出现相应的 Qt 选项!
4.配置开发环境
选择:QT VS Tool -> Qt Options -> Add,配置 Qt 的开发环境。
这里根据 Qt 安装路径进行选择,Path 为:D:\Qt\Qt5.13.2\5.13.2\msvc2017_64。
用VS2017新建Qt项目
导入 Qt 项目
选择:QtVSTool -> Open Qt Project File(.pro)…
新建 Qt 项目
1、选择:文件 -> 新建 -> 项目 -> Qt -> Qt Widget Application,输入工程名,下一步…进行新建。
2、选择依赖的模块:最基础的 QtCore、QtGui、QtWidgets 还有一些音/视频、网络、数据库、XML、OpenGl 相关的模块,需要使用的直接勾选即可。
3.修改Base class选择QWidget,然后点击Finish
环境配置
1.添加包含头文件目录:
工程右键属性->C/C++>常规->附加包含目录
添加D:\Qt\Qt5.13.2\5.13.2\mingw73_32\include
2.添加.lib文件
方法一:
①工程右键属性->链接器->常规->附加库目录
添加D:\Qt\Qt5.13.2\5.13.2\msvc2017_64\lib目录路径
②工程右键属性->链接器->输入->附加依赖项
添加Qt5Widgets.lib
方法二:
库文件比较多时:
①在项目上点击右键->添加->新建筛选器,命名为Lib Files
②在Lib Files上点击右键->添加->现有项,把D:\Qt\Qt5.13.2\5.13.2\msvc2017_64\lib下的所有库文件(*.lib)加入到项目中来即可。
注意:不要把release模式的lib文件也添加进去了(Debug模式lib文件的文件名末尾通常会带d),否则编译会报错:
Qt5AxServer.lib(qaxservermain.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”(HelloWorld_VS.obj 中)
3.xxx.ui文件生成头文件ui_xxx.h
报错找不到ui_HelloWorld_VS.h的问题,在VS环境下创建的Qt工程中HelloWorld_VS.ui文件没生成头文件。
解决方法:
方法一:
选中.ui文件右键,点击编译,生成ui_XXX.h头文件
我创建的工程右键编译选项是灰的,操作如下:
①右键单击ui文件,选择 属性->配置属性->常规->项类型,修改为“自定义生成工具”
③点击"应用"按钮后展开自定义生成工具,具体设置:
命令行:"KaTeX parse error: Undefined control sequence: \bin at position 8: (QTDIR)\̲b̲i̲n̲\uic.exe" -o ".…(QTDIR)\bin\uic.exe;%(AdditionalInputs)
$(QTDIR)在环境变量设置为:D:\Qt\Qt5.13.2\5.13.2\msvc2017_64
④右键ui_xxx.h文件,编译已经变亮了,编译成功后,会生成GeneratedFiles目录,下面生成了ui_HelloWorld_VS.h。将GeneratedFiles目录添加到工程下即可。
方法二:手动生成
①找到Qt安装目录下uic.exe的路径,D:\Qt\Qt5.13.2\5.13.2\msvc2017_64\bin
②Win+R调出命令行,先切换到uic.exe所在路径
③.生成ui_xxx.h文件
uic HelloWorld_VS.ui ui_HelloWorld_VS.h
D:\Qt\Qt5.13.2\5.13.2\msvc2017_64\bin>uic
D:\Code\Qt_Code\HelloWorld_VS\HelloWorld_VS\HelloWorld_VS.ui D:\Code\Qt_Code\HelloWorld_VS\HelloWorld_VS\ui_HelloWorld_VS.h
4.生成moc文件
缺少moc文件的话会报错:
①HelloWorld_VS.obj : error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __cdecl HelloWorld_VS::metaObject(void)const " (?metaObject@HelloWorld_VS@@UEBAPEBUQMetaObject@@XZ)
②HelloWorld_VS.obj : error LNK2001: 无法解析的外部符号 “public: virtual void * __cdecl HelloWorld_VS::qt_metacast(char const *)” (?qt_metacast@HelloWorld_VS@@UEAAPEAXPEBD@Z)
③HelloWorld_VS.obj : error LNK2001: 无法解析的外部符号 “public: virtual int __cdecl HelloWorld_VS::qt_metacall(enum QMetaObject::Call,int,void * *)” (?qt_metacall@HelloWorld_VS@@UEAAHW4Call@QMetaObject@@HPEAPEAX@Z)
问题原因:
当在VS工程中编写QT和C++程序时,要想不同模块之间通过QT的信号(SIGNALS)和槽(SLOT)的机制进行通信,就需要继承于QOBJECT基类,继承于QOBJECT基类的类(文件),会相应的生成一个moc文件,若没有生成moc文件,则不能使用信号和槽。
Qt程序交由标准编译器编译之前,先要使用moc分析C++源文件。如果它发现在一个头文件中包含了宏Q_OBJECT,则会生成另一个C++源文件。这个源文件中包含了Q_OBJECT 宏的实现代码。这个新的文件名字将会是原文件名前面加上 moc_构成。这个新的文件同样将进入编译系统,最终被链接到二进制代码中去。因此我们可以知道,这个新的文件不是“替换”掉旧的文件,而是与原文件一起参与编译。
解决方法:
找到Q_OBJECT宏在哪个文件中用到了
我这边是在HelloWorld_VS.h中用到了,需要生成对应的moc_HelloWorld_VS.cpp文件。
生成方法一:
①HelloWorld_VS.h文件右键选择 属性->配置属性->常规->项类型,②修改为“自定义生成工具”
展开自定义生成工具,具体设置:
命令行:“D:\Qt\Qt5.13.2\5.13.2\msvc2017_64\bin\moc.exe” -o “.\GeneratedFiles\moc_%(Filename).cpp” “%(FullPath)”
说明:Moc%27ing %(Identity)…
输出:.\GeneratedFiles\moc_%(Filename).cpp;%(Outputs)
附加依赖项:D:\Qt\Qt5.13.2\5.13.2\msvc2017_64\bin\moc.exe;%(AdditionalInputs)
③HelloWorld_VS.h文件右键选择编译,会在GeneratedFiles下生成moc_HelloWorld_VS.cpp文件,需要添加到工程中。
生成方法二:手动生成
①找到Qt安装目录下moc.exe的路径:D:\Qt\Qt5.13.2\5.13.2\msvc2017_64\bin
②Win+R调出命令行,先切换到moc.exe所在路径
③切换到HelloWorld_VS.h文件所在路径
④moc HelloWorld_VS.h -o moc_HelloWorld_VS.cpp
5.一个报错处理
报错:
Qt5AxServerd.lib(qaxserver.obj) : error LNK2019: 无法解析的外部符号 “class QAxFactory * __cdecl qax_instantiate(void)” (?qax_instantiate@@YAPEAVQAxFactory@@XZ),该符号在函数 “class QAxFactory * __cdecl qAxFactory(void)” (?qAxFactory@@YAPEAVQAxFactory@@XZ) 中被引用
解决方法:
添加lib时把Qt5AxServerd.lib也加进去了,在Lib Files中移除即可。
6.配置环境变量
问题原因:没有相应的动态库文件
解决方法:
(1)右键计算机 -> 属性 -> 高级系统设置 -> 高级 -> 环境变量,添加环境变量(推荐)
①设置用户变量
QTDIR:D:\Qt\Qt5.13.2\5.13.2\msvc2017_64\bin
PATH:%QTDIR%\bin
或者
②设置系统变量
将库的路径D:\Qt\Qt5.13.2\5.13.2\msvc2017_64\bin\添加到环境变量中,以英文状态下的分号 与其他内容分割。
修改后重启VS即可。
(2)在 Qt 的安装目录(D:\Qt\Qt5.13.2\5.13.2\msvc2017_64\bin)下找到缺少的 *.dll,将其与可执行程序放到同一目录下(不推荐)。