如何在Visual Studio 2017中创建基于CMake的Qt GUI项目
嘿,我来帮你理清这个纠结点!针对你的需求——要做跨Linux开发的Qt GUI应用,用CMake做构建系统——直接创建CMake项目再集成Qt是更顺畅的选择,比先建Qt GUI项目再转CMake要少很多麻烦。后者还要处理qmake到CMake的迁移,容易踩各种配置坑,完全没必要。下面是一步步的具体操作,跟着来就行:
步骤1:创建空白CMake项目
- 打开VS2017,选「创建新项目」,搜索并选中「CMake项目」,给项目起个名字(比如
MyQtCMakeApp),选好保存路径后创建。 - 项目生成后会自带一个
CMakeLists.txt和空的main.cpp,先把默认的main.cpp内容清空,后面我们要写Qt的代码。
步骤2:修改CMakeLists.txt集成Qt
这是核心环节,你需要把默认的CMakeLists.txt替换成以下配置(注释里有说明,记得根据自己的Qt版本调整路径):
cmake_minimum_required(VERSION 3.10) # 定义项目名称和版本 project(MyQtCMakeApp VERSION 1.0 LANGUAGES CXX) # 设置C++标准,Qt5推荐至少C++11 set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 查找Qt的核心组件,这里我们需要Core和Widgets,按需可加Gui、Network等 find_package(Qt5 REQUIRED COMPONENTS Core Widgets) # 开启Qt的自动生成工具:MOC(处理信号槽)、UIC(处理.ui文件)、RCC(处理资源文件) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) # 添加你的源文件、.ui、.qrc等资源,有新文件直接加在这里 add_executable(MyQtCMakeApp main.cpp # 示例:如果有窗口文件可以加 mainwindow.cpp mainwindow.h mainwindow.ui # 示例:资源文件 resources.qrc ) # 把Qt库链接到你的可执行文件 target_link_libraries(MyQtCMakeApp PRIVATE Qt5::Core Qt5::Widgets)
步骤3:编写基础Qt GUI代码
在main.cpp里写入一个简单的Qt窗口代码,验证配置是否生效:
#include <QApplication> #include <QWidget> #include <QLabel> int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget window; window.setWindowTitle("Qt + CMake in VS2017"); QLabel label("Hello from Qt CMake App!", &window); label.move(50, 50); window.show(); return app.exec(); }
步骤4:配置Qt环境(如果VS没自动识别)
如果VS找不到Qt的路径,需要手动指定:
- 打开VS的「CMake」菜单,选择「Change CMake Settings」,打开
CMakeSettings.json。 - 在对应的配置项(比如
x64-Debug)里,找到environmentVariables,添加Qt的环境变量,示例如下:
注意:这里的路径要替换成你自己安装的Qt版本对应的"environmentVariables": { "Qt5_DIR": "C:/Qt/5.15.2/msvc2017_64/lib/cmake/Qt5" }msvc2017_64目录(必须和VS2017的编译器匹配)。
步骤5:构建并运行
- 点击VS工具栏的「生成」按钮,CMake会自动处理Qt的MOC等工具,完成编译。
- 生成成功后点击「运行」,就能看到你的Qt窗口弹出来了!
为什么不推荐先建Qt GUI项目再转CMake?
默认的Qt VS插件生成的项目是基于qmake的,转CMake需要手动把.pro文件的配置迁移到CMakeLists.txt,还要处理路径、资源文件、自动工具的适配,很容易遗漏细节(比如Qt的信号槽自动生成逻辑)。而直接用CMake项目集成Qt,从一开始就用跨平台的CMake管理构建,后续到Linux开发时,只需要调整Qt的路径就能直接编译,完全符合你的需求。
内容的提问来源于stack exchange,提问作者minecraftplayer1234




