【Qt QML】用CMake管理Qt工程

CMake是一个开源、跨平台的工具系列,用于构建、测试和打包软件。CMake使用简单的独立配置文件来控制软件编译过程。与许多跨平台系统不同,CMake被设计为与本地构建环境结合使用。
下面我们在CMake项目中使用Qt的最基本方法。首先,创建一个基本的控制台应用程序。然后,将该项目扩展为使用Qt Widgets的GUI应用程序。

一、用CMake构建控制台应用程序,构建系统选择CMake(Qt6支持)

在这里插入图片描述
Qt Creator为我们自动生成了一个CMakeList.txt,如图:

在这里插入图片描述
CMakeList.txt是CMake项目的核心配置文件,位于项目根目录下,用于定义项目的构建规则和配置选项。通过编写CMake语法,可以在CMakeList.txt中定义项目名称、需要的源文件、依赖项、编译标志、安装规则等。这样可以实现跨平台的项目构建和管理,提供了灵活性和可扩展性。工程中自动生成的CMakeList内容如下:

cmake_minimum_required(VERSION 3.14)         #指定构建应用程序最低的CMake版本,通常放在CMakeList最开始project(TestCMakeConsole LANGUAGES CXX)      #设定项目名称和默认版本,Languages参数用来告诉CMake程序是用C++写的#用来告诉CMake工具自动处理UI文件、MOC文件和资源文件的指令
set(CMAKE_AUTOUIC ON)                       #开启自动生成UI头文件的功能,即对应UI文件(.ui)会生成对应的UI头文件,无需手动编写
set(CMAKE_AUTOMOC ON)                       #开启自动生成MOC文件的功能,即处理带有Q_OBJECT宏的QObject派生类的头文件,生成相应的MOC文件。MOC (Meta-Object Compiler) 是用于处理信号槽机制的工具
set(CMAKE_AUTORCC ON)                       #开启自动生成资源文件的功能,即处理.qrc文件,生成相应的资源文件set(CMAKE_CXX_STANDARD 17)                  #指定需要C++17或者高的编译器支持
set(CMAKE_CXX_STANDARD_REQUIRED ON)         #强制指定编译器支持,如果编译器太旧,CMake将打印错误find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core)            #查找Qt5或Qt6并导入Core模块,Required参数标志是告诉CMake这种查找是强制的,如果没找到则中止
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core)       #强制指定到的Qt版本是由QT_VERSION_MAJOR参数指定的版本,找到后导入Core模块add_executable(TestCMakeConsole             #告诉CMake我们想要构建一个名为TestCMakeConsole的可执行文件作为目标。目标应该从c++源文件main.cpp构建。注意,这里通常不列出头文件。main.cpp
)
target_link_libraries(TestCMakeConsole Qt${QT_VERSION_MAJOR}::Core)   #告诉CMake, TestCMakeConsole可执行文件通过引用上面find_package()调用导入的Qt6::Core目标来使用Qt Core。include(GNUInstallDirs)                     #包含GNUInstallDirs模块,它定义了一些安装目录变量,方便在后续的安装过程中使用#指定了一个名为TestCMakeConsole的目标,指定了在安装时将该目标生成的库文件安装到${CMAKE_INSTALL_LIBDIR}目录下,将生成的可执行文件安装到${CMAKE_INSTALL_BINDIR}目录下。
#这样可以确保在安装项目时,生成的文件会被安装到正确的目录下。
install(TARGETS TestCMakeConsoleLIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

二、用CMake构建GUI应用程序

在这里插入图片描述
同样,我们继续分析Qt Creator为Demo工程自动生成的CMakeList.txt。

cmake_minimum_required(VERSION 3.5)     #指定构建应用程序最低的CMake版本为3.5,通常放在CMakeList最开始project(testCMakeGui VERSION 0.1 LANGUAGES CXX)   #设定项目名称和默认版本,Languages参数用来告诉CMake程序是用C++写的set(CMAKE_AUTOUIC ON)                   #见上文
set(CMAKE_AUTOMOC ON)                   #见上文
set(CMAKE_AUTORCC ON)                   #见上文set(CMAKE_CXX_STANDARD 17)              #见上文
set(CMAKE_CXX_STANDARD_REQUIRED ON)     #见上文find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)             #见上文,不同的是基于QWidget的GUI应用我们需要导入Widgets模块
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)        #见上文set(PROJECT_SOURCES                     #通过设置PROJECT_SOURCES变量来指定项目所需的所有源文件。这些源文件将在项目构建时被编译并链接到可执行文件中。main.cppmainwindow.cppmainwindow.hmainwindow.ui
)#首先检查 Qt 版本是否大于或等于 6。如果是,则使用 qt_add_executable() 函数来创建一个名为 testCMakeGui 的可执行文件,指定 MANUAL_FINALIZATION,并包含之前定义的项目源文件列表。
#如果 Qt 版本是 6,还会有一个注释部分,说明如何在 Android 下为 testCMakeGui 定义属性。该注释提供了一个 set_property() 调用的示例,用于指定 QT_ANDROID_PACKAGE_SOURCE_DIR。
#如果 Qt 版本小于6,代码将进入 else 分支。在此分支中,会检查是否为 Android 平台。如果是 Android 平台,将使用 add_library() 函数创建一个名为 testCMakeGui 的共享库(SHARED),并包含项目源文件列表。
#同样也有一个注释,用于定义 Qt 5 中 Android 平台的属性设置。
#如果不是 Android 平台,将使用 add_executable() 函数创建一个名为 testCMakeGui 的可执行文件,并包含项目源文件列表。
#这段代码根据 Qt 版本和平台类型选择不同的构建方式,并为每种情况定义了相应的属性。这样可以确保项目在不同的环境和版本下都能正确构建。
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)qt_add_executable(testCMakeGuiMANUAL_FINALIZATION${PROJECT_SOURCES})
# Define target properties for Android with Qt 6 as:
#    set_property(TARGET testCMakeGui APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
#                 ${CMAKE_CURRENT_SOURCE_DIR}/android)
# For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation
else()if(ANDROID)add_library(testCMakeGui SHARED${PROJECT_SOURCES})
# Define properties for Android with Qt 5 after find_package() calls as:
#    set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")else()add_executable(testCMakeGui${PROJECT_SOURCES})endif()
endif()#确保了 testCMakeGui 目标可以访问并使用 Qt Widgets 模块中的功能,这样在构建和运行项目时就能正确地链接和使用 Qt 组件
target_link_libraries(testCMakeGui PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)
#在 Qt 6.1 及以后的版本中,Qt for iOS会自动设置MACOSX_BUNDLE_GUI_IDENTIFIER,但如果Qt版本低于6.1.0,则需要手动设置一个固定的Bundle Identifier,以确保应用程序在macOS上正确识别和管理。
#默认的Bundle Identifier设置为com.example.testCMakeGui,可以根据需要修改。
if(${QT_VERSION} VERSION_LESS 6.1.0)set(BUNDLE_ID_OPTION MACOSX_BUNDLE_GUI_IDENTIFIER com.example.testCMakeGui)
endif()#通过set_target_properties函数设置了testCMakeGui目标的属性。其中,${BUNDLE_ID_OPTION}是之前定义的用于设置Bundle Identifier的变量。
#另外,MACOSX_BUNDLE_BUNDLE_VERSION被设置为项目版本,MACOSX_BUNDLE_SHORT_VERSION_STRING被设置为项目主版本号和次版本号的组合。MACOSX_BUNDLE属性被设置为TRUE,表示当前目标是一个macOS bundle。
#WIN32_EXECUTABLE属性被设置为TRUE,表示当前目标是一个Win32可执行程序。
set_target_properties(testCMakeGui PROPERTIES${BUNDLE_ID_OPTION}MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}MACOSX_BUNDLE TRUEWIN32_EXECUTABLE TRUE
)#见上文
include(GNUInstallDirs)
install(TARGETS testCMakeGuiBUNDLE DESTINATION .LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)#如果主版本号等于6,则调用qt_finalize_executable函数来完成testCMakeGui可执行文件的最终配置。
if(QT_VERSION_MAJOR EQUAL 6)qt_finalize_executable(testCMakeGui)
endif()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/6063.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统架构设计师错题集

在实时操作系统中,两个任务并发执行,一个任务要等待另一个任务发来消息,或建立某个条件后再向前执行,这种制约性合作关系被称为任务的(9)。 (9)A.同步 B.互斥 C.调度 D.执行 【答案】A 【解析】本题考查…

Linux图形化界面怎么进入?CentOS 7图形界面切换

CentOS 7默认只安装命令行界面。要切换到图形界面,需要先检查系统是否安装图形界面,在终端输入以下命令: systemctl get-default若是返回结果是“multi-user.target”表示系统没有安装图形界面;若是返回结果是“graphical.target…

Linux migrate_type进一步探索

文章接着上回Linux migrate_type初步探索 1、物理页面添加到buddy系统 我们都知道物理内存一开始是由memblock进行分配管理,后面会切换到buddy系统管理。那么接下来我们看一下,memblock管理的物理页面是怎么添加到buddy系统中的。 start_kernel() -&g…

双指针(C++)

文章目录 1、移动零2、复写零3、快乐数4、盛最多水的容器5、有效三角形的个数6、和为s的两个数7、三数之和8、四数之和 需要理解的是,双指针并非只有指针,双指针的意思是两个位置。比如对于数组来说,两个下标也是双指针。当然,也可…

merge and rebase

文章目录 什么是merge什么是rebasemerge和rebase的区别操作执行git merge操作git rebase操作冲突解决解决冲突的步骤 Git Merge 和 Git Rebase 都是用于集成来自不同分支的修改的 Git 命令。 什么是merge Git Merge 是将一个分支的改动合并到另一个分支的方式。当你执行一个 m…

LabVIEW机械臂控制与图像处理示教平台

LabVIEW机械臂控制与图像处理示教平台 随着工业自动化技术的快速发展,工业机器人在制造业中的应用越来越广泛,它们在提高生产效率、降低人工成本以及保证产品质量方面发挥着重要作用。然而,传统的工业机器人编程和操作需要专业知识&#xff…

2024-5-3学习笔记 虚拟继承原理

目录 原理 总结 前面提到过,解决菱形继承产生的数据二义性问题和数据冗余,就需要用到虚拟继承,关于它是如何解决的,我们来一起研究。 class Person { public :string _name ; // 姓名 }; class Student : virtual public Perso…

某招聘网站搜索结果接口逆向之webpack扣取

逆向网址 aHR0cHM6Ly93ZS41MWpvYi5jb20v 逆向链接 aHR0cHM6Ly93ZS41MWpvYi5jb20vcGMvc2VhcmNoP2pvYkFyZWE9MDAwMDAwJmtleXdvcmQ9cGhwJnNlYXJjaFR5cGU9MiZrZXl3b3JkVHlwZT0 逆向接口 aHR0cHM6Ly93ZS41MWpvYi5jb20vYXBpL2pvYi9zZWFyY2gtcGM 逆向过程 请求方式 POST 逆向参数 …

华为Pura70发布,供应链公司进入静默保密期

保密措施:与华为Pura70发布相关的供应链公司在产品发布前后处于静默保密期。这可能是由于华为对于手机供应链的一些信息处于保密状态,尤其是关于麒麟芯片的代工厂商等敏感信息。这种保密措施有助于保持产品的神秘感,调动用户的好奇心&#xf…

微信小程序+esp8266温湿度读取

本文主要使用微信小程序显示ESP8266读取的温湿度并通过微信小程序控制LED灯。小程序界面如下图所示 原理讲解 esp8266 通过mqtt发布消息,微信小程序通过mqtt 订阅消息,小程序订阅后,就可以实时收到esp8266 传输来的消息。 个人可免费注册五个微信小程序账号,在微信小程序官…

开源框架 NanUI 项目宣布将暂停开发,作者转行卖钢材

NanUI 界面组件是一个开源的 .NET 窗体应用程序界面框架,适用于希望使用 HTML5 / CSS3 等前端技术来构建 Windows 窗体应用程序用户界面的 .NET 开发人员。 该项目的作者林选臣日前在 GitHub 上发布了停更公告,称因去年被裁员失业,他目前已经…

Redis 实战1

SDS Redis 只会使用 C 字符串作为字面量, 在大多数情况下, Redis 使用 SDS (Simple Dynamic String,简单动态字符串)作为字符串表示。 比起 C 字符串, SDS 具有以下优点: 常数复杂度获取字符串…

R语言学习—4—数据矩阵及R表示

1、创建向量、矩阵 在R中,c()函数用于创建向量或组合数据对象。它在某些情况下可能会被省略,因为R有一些隐式的向量创建规则。例如,当你使用:操作符创建一个数字序列时,R会自动创建一个向量,所以你不需要显式地调用c()…

UI-Diffuser——使用生成式扩散模型的UI原型设计算法解析

概述。 移动UI是影响参与度的一个重要因素,例如用户对应用的熟悉程度和使用的便利性。如果你有一个类似的应用程序,你可能会选择一个具有现代、好看的设计的应用程序,而不是一个旧的设计。然而,要从头开始研究什么样的UI最适合应…

[leetcode]Z 字形变换

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:string convert(string s, int numRows) {int n s.length(), r numRows;if (r 1 || r > n) {return s;}int t r * 2 - 2;int c (n t - 1) / t * (r - 1);vector<string> mat(r, string(c, 0)…

达梦(DM) SQL聚集函数及日期运算操作

达梦DM SQL聚集函数及日期运算操作 聚集函数MAX、MIN、SUM、AVG、COUNT使用分析函数 sum (…) over (order by…) 可以生成累计和更改累计和的值计算出现次数最多的值 日期运算加减日、月、年加减时、分、秒日期间隔之时、分、秒日期间隔之日、月、年求两个日期间的工作天数确定…

Java基础知识(三) -- 流程控制

不论哪种编程语言&#xff0c;都会提供两种基本的流程控制结构&#xff1a;分支结构和循环结构。其中分支结构用于实现根据条件来选择性地执行某段代码&#xff0c;循环结构则用于实现根据循环条件重复执行某段代码。 1. 顺序结构 任何编程语言中最常见的程序结构就是顺序结构…

单片机编程实例400例大全(100-200)

今天继续分享单片机编程实例第100-200例。 今天的实例会比前面100复杂一些&#xff0c;我大概看了下&#xff0c;很多都具备实际产品的参考价值。 今天继续分享单片机编程实例第100-200例。 今天的实例会比前面100复杂一些&#xff0c;我大概看了下&#xff0c;很多都具备实际…

频分复用系统设计及其MATLAB实现

引言 随着通信技术的飞速发展&#xff0c;通信系统的容量需求不断增长。频分复用&#xff08;Frequency Division Multiplexing, FDM&#xff09;作为一种重要的多路复用技术&#xff0c;被广泛应用于现代通信系统中。本文将介绍频分复用系统的设计原理&#xff0c;并展示如何…

简单工厂模式、工厂方法模式和抽象工厂模式

1、简单工厂模式 1.1 结构 简单工厂包含如下角色&#xff1a; 抽象产品 &#xff1a;定义了产品的规范&#xff0c;描述了产品的主要特性和功能。 具体产品 &#xff1a;实现或者继承抽象产品的子类 具体工厂 &#xff1a;提供了创建产品的方法&#xff0c;调用者通过该方法…