Qt Creator + CMake 构建教程

ops/2025/2/27 10:21:25/

此教程基于:

  • Qt 6.7.4
  • Qt Creator 15.0.1
  • CMake 3.26.4

Qt 6 以下的版本使用 CMake 构建可能会存在一些问题.

目录

  • 新建窗体工程
  • 更新翻译
  • 添加资源
  • 软件部署(Deploy)

此教程描述了如何一步步在 Qt Creator 中使用 CMake 构建应用程序工程. 涉及 新建窗体工程, 更新翻译, 添加资源, 以及软件部署等环节.

新建窗体工程

此过程描述如何在Qt Creator中新建一个使用 CMake 构建的窗体应用程序.

  • 运行 Qt Creator, 点击Welcome页中的 Create Project... 按钮.
  • 在新建工程对话框中选择: Application(Qt) | Qt Widgets Application, 点击右下角 Choose… 按钮.

在这里插入图片描述

  • 设置新建工程的名称和路径, 点击 Next.

在这里插入图片描述

  • 构建系统选择: CMake, 点击 Next.

在这里插入图片描述

  • 类信息页不做修改, 点击 Next.

在这里插入图片描述

  • 翻译文件页, 选择: Chinese(China), 点击 Next.

在这里插入图片描述

  • 点击 Finish 按钮, 完成新建工程.

在这里插入图片描述

  • 新建工程完毕后, 开发界面如下图所示. 工程的构建, 调试, 运行, 以及编译套件和编译配置的切换分别对应图中的1,2,3,4.

在这里插入图片描述

  • 这里我们选择 Desktop_Qt_6_7_3_MSVC2019_64bit.

在这里插入图片描述

  • 点击 构建 按钮, 完成工程的编译; 点击 运行 按钮, 运行示例程序.

更新翻译

  • 使用 Linguist 打开 helloworld_zh_CN.ts(建议将 .ts 文件的打开方式直接设置为 Linguist)

在这里插入图片描述

  • 设置 MainWindow 的中文翻译为: 主窗体, 确认并保存.

在这里插入图片描述

  • 注释掉: qt_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} ${TS_FILES}), 并添加: qt_add_translations(TARGETS helloworld TS_FILES ${TS_FILES}) (helloworld 是此工程的构建目标), 然后保存.

在这里插入图片描述

  • 切换到Projects 模式页, 点击 Add Build Step 工具按钮, 选择 CMake Build 菜单.

在这里插入图片描述- 勾选 update_translations目标, 去除勾选 all目标, 并将此构建步骤向上移动 (或直接修改构建步骤中的第一个)

在这里插入图片描述

  • 点击 Build 按钮, 重新构建. 从编译输出窗口中, 可以看到程序的构建过程为:
    1. 更新 helloworld_zh_CN.ts;
    2. 生成 helloworld_zh_CN.qm;
    3. 链接生成 helloworld.exe.

在这里插入图片描述- 点击 Run按钮运行此程序, 可以看到主窗体的标题栏已经显示为中文.

在这里插入图片描述

添加资源

此过程, 我们将添加一个图标资源, 并将此图标设置为主窗体的窗口图标.

  • 使用资源管理器打开工程所在目录, 新建名为 images 的文件夹, 并将图标logo.png放置到此文件夹下.
  • CMakeLists.txt 文件中添加:
 # qt_add_resources(<TARGET> <RESOURCE_NAME> [PREFIX <PATH>] [FILES ...])qt_add_resources(helloworld imageresourcesPREFIX "/"FILES images/logo.png)

其中, FILES参数指定要添加的文件

  • 点击 Build 按钮, 完成构建. 此时在工程视图中可以看到logo.png已添加到工程的资源文件中.

在这里插入图片描述

  • 修改 MainWindow.cpp, 在其中指定窗体图标.
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);setWindowIcon(QIcon(":/images/logo.png")); // TODO:
}
  • 再次构建, 并运行. 此时窗口图标已更换为我们指定的图标文件.

在这里插入图片描述

软件部署(Deploy)

构建生成的 helloworld.exe 在目标计算机上运行, 还需要一系列依赖的动态库. Qt 提供了 qt_generate_deploy_app_script() 命令, 可以方便的打包应用程序所需的运行环境.

  • CMakeLists.txt 中添加以下代码, 生成部署脚本:
qt_generate_deploy_app_script(TARGET helloworldOUTPUT_SCRIPT deploy_scriptNO_UNSUPPORTED_PLATFORM_ERROR
)
install(SCRIPT ${deploy_script})
  • CMakeLists.txt 中设置安装目录前缀 (CMAKE_INSTALL_PREFIX )为 ${PROJECT_BINARY_DIR}/install:
set(CMAKE_INSTALL_PREFIX ${PROJECT_BINARY_DIR}/install)
  • 切换到工程模式, 添加构建步骤, 设置构建目标为install:

在这里插入图片描述

  • 点击Build 按钮, 完成构建, 在编译输出窗口可以看到如下信息:
12:36:02: Starting: "C:\Program Files\CMake\bin\cmake.exe" --build D:/workspace/qt/helloworld/build/Desktop_Qt_6_7_3_MSVC2019_64bit-Debug --target install
[0/1 ?/sec] Install the project...
-- Install configuration: "Debug"
-- Writing D:/workspace/qt/helloworld/build/Desktop_Qt_6_7_3_MSVC2019_64bit-Debug/install/bin/qt.conf
-- Running Qt deploy tool for D:/workspace/qt/helloworld/build/Desktop_Qt_6_7_3_MSVC2019_64bit-Debug/helloworld.exe in working directory 'D:/workspace/qt/helloworld/build/Desktop_Qt_6_7_3_MSVC2019_64bit-Debug/install'
'C:/Qt/6.7.3/msvc2019_64/bin/windeployqt.exe' 'D:/workspace/qt/helloworld/build/Desktop_Qt_6_7_3_MSVC2019_64bit-Debug/helloworld.exe' '--dir' '.' '--libdir' 'bin' '--plugindir' 'plugins' '--qml-deploy-dir' 'qml' '--translationdir' 'translations' '--force' '--qtpaths' 'C:/Qt/6.7.3/msvc2019_64/bin/qtpaths6.exe'
D:\workspace\qt\helloworld\build\Desktop_Qt_6_7_3_MSVC2019_64bit-Debug\helloworld.exe 64 bit, debug executable
Adding in plugin type generic for module: Qt6Gui
Skipping plugin qinsighttrackerd.dll. Use -deploy-insighttracker if you want to use it.
Adding Qt6Network for qtuiotouchplugind.dll from plugin type: generic
Adding in plugin type iconengines for module: Qt6Gui
Adding Qt6Svg for qsvgicond.dll from plugin type: iconengines
Adding in plugin type imageformats for module: Qt6Gui
Adding Qt6Pdf for qpdfd.dll from plugin type: imageformats
Adding in plugin type networkinformation for module: Qt6Network
Adding in plugin type platforminputcontexts for module: Qt6Gui
Skipping plugin qtvirtualkeyboardplugind.dll due to disabled dependencies (Qt6Qml Qt6Quick).
Adding in plugin type platforms for module: Qt6Gui
Adding in plugin type styles for module: Qt6Widgets
Adding in plugin type tls for module: Qt6Network
Direct dependencies: Qt6Core Qt6Gui Qt6Widgets
All dependencies   : Qt6Core Qt6Gui Qt6Widgets
To be deployed     : Qt6Core Qt6Gui Qt6Network Qt6Pdf Qt6Svg Qt6Widgets
Updating Qt6Cored.dll.
Updating Qt6Guid.dll.
.........
Creating qt_zh_CN.qm...
Creating qt_zh_TW.qm...
-- Installing: D:/workspace/qt/helloworld/build/Desktop_Qt_6_7_3_MSVC2019_64bit-Debug/install/bin/helloworld.exe
12:36:03: The process "C:\Program Files\CMake\bin\cmake.exe" exited normally.
12:36:03: Elapsed time: 00:03.
  • 在资源管理器中打开 D:/workspace/qt/helloworld/build/Desktop_Qt_6_7_3_MSVC2019_64bit-Debug/install/bin目录, 运行 hello world.exe, 此时程序可以正常运行.

http://www.ppmy.cn/ops/161651.html

相关文章

音频模拟信号转数字信号的原理

音频模拟信号转数字信号的原理 音频信号是自然界中常见的模拟信号(Analog Signal),它是连续的、随时间变化的波形。为了在计算机或数字设备中处理和存储音频信号,需要将模拟信号转换为数字信号(Digital Signal)。这个过程称为 模数转换(Analog-to-Digital Conversion, …

从Excel到Hadoop:数据规模的进化之路

从Excel到Hadoop&#xff1a;数据规模的进化之路 在数字时代&#xff0c;数据就像空气&#xff0c;充斥在我们生活的每个角落。今天我们谈"大数据"&#xff0c;但回头看看&#xff0c;数据的演变经历了从"小数据"到"大数据"的量变到质变的过程。…

WSL,Power shell 和CMD, Git bash的区别

在 Windows 系统中&#xff0c;WSL、PowerShell、CMD、Git Bash 和 Git Bash&#xff08;管理员&#xff09; 是不同的命令行工具和环境&#xff0c;它们各自有不同的用途和特点。以下是它们的详细关系和区别&#xff1a; 1. WSL&#xff08;Windows Subsystem for Linux&…

【笔记ing】C语言补充、组成原理数据表示与汇编实战、操作系统文件实战(高级阶段)

【第19节 C语言语法进阶】 【19.1 条件运算符与逗号运算符】 1 条件运算符 条件运算符是C语言中唯一的一种三亩运算符。三目运算符代表有三个操作数&#xff1b;双目运算符代表有两个操作数&#xff0c;如逻辑运算符就是双目运算符&#xff1b;弹幕运算符代表有一个操作数&a…

人工智能任务23-天文领域的超亮超新星能源机制结合深度神经网络的研究方向

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能任务23-天文领域的超亮超新星能源机制结合深度神经网络的研究方向。 文章目录 一、研究背景阐述超亮超新星的定义与发现历程超亮超新星能源机制的主要理论模型1. 56Ni衰变模型2. 超新星抛射物与致密星周介…

FastJSON 默认行为:JSON.toJSONString 忽略 null 字段

完整的 FakeRegistrationController 代码&#xff0c;这让我可以全面分析后端逻辑&#xff0c;特别是为什么空的字段&#xff08;如 compareDate&#xff09;不返回给前端。我将详细分析代码的每个接口&#xff0c;尤其是与 list 请求和字段返回相关的部分&#xff0c;并解释原…

Python Pandas带多组参数和标签的Oracle数据库批量数据导出程序

设计一个基于多个带标签的PL/SQL模板作为配置文件和多组参数的Python Pandas代码程序&#xff0c;实现根据不同的输入参数自动批量地将Oracle数据库中的数据导出为CSV和Excel文件到指定目录上&#xff0c;标签和多个参数&#xff08;以“_”分割&#xff09;为组成导出数据文件…

Java线程池实战:如何避免常见坑点并优化性能?

在使用Java线程池时&#xff0c;避免常见坑点并优化性能是非常重要的。以下是一些关键的实践和建议&#xff0c;帮助你更好地管理和优化线程池的性能。 1. 选择合适的线程池类型 Java提供了几种不同类型的线程池&#xff0c;每种适用于不同的场景&#xff1a; FixedThreadPoo…