CMake入门教程【高级篇】qmake转cmake
😈「CSDN主页」:传送门
😈「Bilibil首页」:传送门
😈「动动你的小手」:点赞👍收藏⭐️评论📝
文章目录
- 1. 概述
- 2.qmake与cmake的差异
- 3. qmake示例
- 4.qmake转cmake示例
- 5.MOC、UIC和RCC是啥
- 6. 实战使用技巧与注意事项
- 7.qmake添加qt包
- 8.cmake添加Qt包
1. 概述
在CMake中构建Qt项目意味着能够高效地管理和编译Qt应用程序和库。CMake提供了一套强大的工具和方法来处理Qt的特殊构建需求,如MOC(元对象编译器)处理、UI文件和资源的管理。
2.qmake与cmake的差异
- qmake
- 专注于Qt:qmake是Qt框架的一部分,主要用于构建使用Qt的应用程序。它天生支持Qt的各种特性,如信号和槽、国际化、资源文件等。
- 配置简单:对于纯Qt项目,qmake的配置文件(.pro文件)通常更简单,更易于编写和维护。
- 跨平台:虽然qmake支持跨平台构建,但其核心功能主要集中在Qt应用程序上。
- 限制:qmake在非Qt项目的通用性和灵活性方面受到限制,特别是在处理复杂构建场景时。
- CMake
- 通用性:CMake是一个更通用的构建系统工具,适用于各种C++项目,包括但不限于Qt应用程序。
- 高度灵活:CMake提供了更多的高级特性和更大的灵活性来处理复杂的构建需求。
- 广泛支持:CMake得到广泛的支持和使用,是许多开源项目和大型应用程序的首选构建系统。
- 学习曲线:由于其功能丰富和灵活性高,CMake的学习曲线可能会比qmake陡峭。
- 跨平台构建:CMake在处理跨平台构建方面表现更好,支持生成多种IDE和构建系统的工程文件。
- 集成和扩展:CMake支持更广泛的集成和扩展,如测试、打包、导入/导出目标等
3. qmake示例
- MyQtProject.pro
QT += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = MyQtProject
TEMPLATE = appSOURCES += main.cppFORMS += MainWindow.ui
- main.cpp
#include <QApplication>
#include <QMainWindow>
#include "ui_MainWindow.h"int main(int argc, char *argv[]) {QApplication app(argc, argv);QMainWindow mainWindow;Ui::MainWindow ui;ui.setupUi(&mainWindow);mainWindow.show();return app.exec();
}
4.qmake转cmake示例
- CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyQtProject)#设置Qt的安装路径,如果Qt没有在环境变量中
#set(CMAKE_PREFIX_PATH "/path/to/Qt")# Find the QtWidgets library
find_package(Qt5Widgets CONFIG REQUIRED)# 启用自动MOC、UIC和RCC
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)# Add an executable
add_executable(MyQtProject main.cpp MainWindow.ui)# Use the Widgets module from Qt 5
target_link_libraries(MyQtProject Qt5::Widgets)
5.MOC、UIC和RCC是啥
-
MOC(Meta-Object Compiler):
-
作用:MOC是一个元对象编译器,用于处理Qt的信号与槽机制以及其他一些通过
Q_OBJECT
宏启用的元对象系统的特性。 -
原理:当你在类定义中使用
Q_OBJECT
宏时,MOC将读取这个头文件,生成一个包含元信息(如信号、槽、属性)的附加源文件。这个附加的源文件在编译时与原始类的源文件一起编译。 -
重要性:没有MOC的处理,Qt的信号和槽机制无法正常工作。
-
-
UIC(User Interface Compiler):
-
作用:UIC是用户界面编译器,用于将由Qt Designer创建的
.ui
文件(XML格式)转换成C++源代码。 -
原理:UIC会生成一个头文件,这个文件包含创建和布局UI组件所需的代码。这样,开发者可以直接在代码中使用这些组件。
-
重要性:UIC使得开发者能够方便地通过Qt Designer设计UI,并在应用程序中使用这些设计。
-
-
RCC(Resource Compiler):
-
作用:RCC是资源编译器,用于将资源文件(如图片、翻译文件、其他文件)编译成二进制格式。
-
原理:RCC会处理
.qrc
资源文件,这些文件以XML格式列出了项目中使用的资源。RCC生成一个包含资源数据的源文件。 -
重要性:RCC允许开发者将资源文件(如图标、翻译文件等)嵌入到应用程序的二进制文件中,方便资源的打包和部署
-
6. 实战使用技巧与注意事项
- 确保安装了Qt和CMake的适当版本。
- 使用
CMAKE_AUTOMOC
,CMAKE_AUTORCC
,CMAKE_AUTOUIC
自动处理MOC、RCC和UIC。 - 在
find_package
中明确指定需要的Qt模块。 - 使用
target_link_libraries
正确链接Qt库。
7.qmake添加qt包
QT += core gui
- core: 核心非GUI功能,如事件循环、核心数据类型等。
- gui: 图形用户界面组件,如窗口、控件。
- widgets: 高级GUI组件,如按钮、文本框、滑块等。
- network: 网络通信功能。
- sql: 数据库支持。
- qml: QML - Qt 声明式语言支持。
- quick: Qt Quick 框架,用于构建现代UI。
- multimedia: 音视频播放和录制。
- bluetooth: 蓝牙功能支持。
- websockets: WebSocket通信支持。
- xml: XML处理功能。
- opengl: OpenGL集成。
- printsupport: 打印支持。
8.cmake添加Qt包
CMake中Qt添加包的方式,如果是Qt6就把Qt5改成Qt6
注意部分模块Qt6没有了,详情的话查官方文档
Qt5: https://doc.qt.io/qt-5/qtmodules.html
Qt6: https://doc.qt.io/qt-6/qtmodules.html
find_package(Qt5 COMPONENTS Widgets Network REQUIRED)
target_link_libraries(YourApp Qt5::Widgets Qt5::Network)
- Qt5Core: 核心模块,提供非GUI功能的基本类。
- Qt5Gui: 图形用户界面组件,处理图形元素。
- Qt5Widgets: 提供丰富的界面组件,用于构建桌面应用。
- Qt5Network: 提供网络通信功能。
- Qt5Multimedia: 用于处理音频、视频等多媒体内容。
- Qt5Sql: 提供SQL数据库支持。
- Qt5Qml: 支持QML,用于开发动态用户界面。
- Qt5Quick: 结合Qt5Qml使用,快速开发现代UI。
- Qt5WebEngine: 嵌入Web内容的功能,基于Chromium。
- Qt5Test: 提供单元测试功能。
- Qt5OpenGL: 提供OpenGL集成支持。
- Qt5Xml: 处理XML数据的功能。
- Qt5Concurrent: 提供并发编程支持。
- Qt5PrintSupport: 提供打印功能支持。
- Qt5Svg: 支持SVG文件格式。
- Qt5Bluetooth: 提供蓝牙功能支持。
- Qt5Location: 提供地理位置和地图功能。
- Qt5Sensors: 提供访问硬件传感器的功能。
- Qt5WebSockets: 提供WebSocket通信支持。
- Qt5QmlModels: 提供QML数据模型支持。
- Qt5SerialPort: 提供串口通信功能
相关文章:

CMake入门教程【高级篇】qmake转cmake
😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 1. 概述2.qmake与cmake的差异3. qmake示例4.qmake转cmake示例5.MOC、UIC和RCC…...

c#图片作为鼠标光标
图片转换为鼠标光标代码如下: private void Form1_Load(object sender, EventArgs e) {//button1.Cursor System.Windows.Forms.Cursors.Hand;Bitmap bmp new Bitmap("780.jpg");Cursor cursor new Cursor(bmp.GetHicon());button1.Cursor cursor;} …...

微信小程序swiper实现层叠轮播图
在微信小程序中,需要实现展示5个,横向层叠的轮播图效果,轮播图由中间到2侧的依次缩小.如下图 使用原生小程序进行开发,没有使用Skyline模式,所以layout-type配置项也无效。所以基于swiper组件进行调整。 主要思路就是设置不同的样式ÿ…...

揭露欧拉骗局第二篇:逼近公式“Σ1/n=lnn+C”。
Σ1/nlnnC是欧拉为调和级数创造(注意是创造、而不是发现)的“逼近公式”,它在欧系大名鼎鼎,因为它解决了欧洲人百筹莫展的“调和级数求和问题”。 “lnnC”是欧拉的发明,欧拉认为n→∞时,Σ1/nlnn常数,这个常数就是欧…...

MYSQL的学习——单行函数详解
目录 1. 数值函数 1) 基本函数 2) 角度与弧度互换函数 3) 三角函数 4) 指数与对数函数 5) 进制间的转换 2. 字符串函数 3. 日期和时间函数 1) 获取日期、时间 2) 日期与时间戳的转换 3) 获取月份、星期、星期数、天数等函数 4) 日期的操作函数 5) 时间和秒钟转换的…...

深度解析Cron表达式:精确控制任务调度的艺术
深度解析Cron表达式:精确控制任务调度的艺术 希望我们都可以满怀期待的路过每一个转角 去遇见 那个属于自己故事的开始 去追寻那个最真实的自己 去放下 去拿起 安然,自得,不受世俗牵绊… 导言 在计算机科学领域,任务调度是一项关…...

java实现AES256对称加解密工具类
一、引入依赖包 引入相关依赖包 <dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.70</version> </dependency> <!--lombok用于简化实体类开发--> <dependency&g…...

其他排序(基数排序,希尔排序和桶排序)(数据结构课设篇3,python版)(排序综合)
本篇博客主要详细讲解一下其他排序(基数排序,希尔排序和桶排序)也是排序综合系列里最后一篇博客。第一篇博客讲解的是LowB三人组(冒泡排序,插入排序,选择排序)(数据结构课设篇1&…...
【复现】DiffTalk
code:GitHub - sstzal/DiffTalk: [CVPR2023] The implementation for "DiffTalk: Crafting Diffusion Models for Generalized Audio-Driven Portraits Animation" 问题1. ERROR: Failed building wheel for pysptk Cython.Compiler.Errors.CompileError:…...
SQLServer 系统概述
目录 1.SQL语言的发展和特点 2.SQL语言的特点 1.SQL语言的发展和特点 SQL是利用一些简单的语句构成的基本语法,来存储数据库的内容。目前已经成为关系型数据库系统中使用最广泛的语言。 1974年SQL语言由Boyce和Chamberlin提出来。 1975~1979年研制了著名的关系数…...

Vue3 + TS + Element-Plus —— 项目系统中封装表格+搜索表单 十分钟写五个UI不在是问题
前期回顾 纯前端 —— 200行JS代码、实现导出Excel、支持DIY样式,纵横合并-CSDN博客https://blog.csdn.net/m0_57904695/article/details/135537511?spm1001.2014.3001.5501 目录 一、🛠️ newTable.vue 封装Table 二、🚩 newForm.vue …...

Linux系统——测试端口连通性方法
目录 一、TCP端口连通性测试 1、ssh 2、telnet(可能需要安装) 3、curl 4、tcping(需要安装) 5、nc(需要安装) 6、nmap(需要安装) 二、UDP端口连通性测试 1、nc(…...

Python虚拟环境轻松配置:Jupyter Notebook中的内核管理指南
问题 在Python开发中,一些人在服务器上使用Jupyter Notebook中进行开发。一般是创建虚拟环境后,向Jupyter notebook中添加虚拟环境中的Kernel,后续新建Notebook中在该Kernel中进行开发,这里记录一下如何创建Python虚拟环境以及添…...

大数据-hive函数与mysql函数的辨析及练习-将多行聚合成一行
目录 1. 🥙collect_list: 聚合-不去重 2. 🥙collect_set(col): 聚合-去重 3. 🥙mysql的聚合函数-group_concat 4. leetcode练习题 1. 🥙collect_list: 聚合-不去重 将组内的元素收集成数组 不会去重 2. 🥙collec…...

【AI视野·今日NLP 自然语言处理论文速览 第七十三期】Tue, 9 Jan 2024
AI视野今日CS.NLP 自然语言处理论文速览 Tue, 9 Jan 2024 Totally 80 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers FFSplit: Split Feed-Forward Network For Optimizing Accuracy-Efficiency Trade-off in Language Model Infe…...

vue知识-03
购物车案例 要实现的功能: 1、计算商品总价格 2、全选框和取消全选框 3、商品数量的增加和减少 <body> <div id"app"><div class"row"><div class"col-md-6 col-md-offset-3"><h1 class"text-center…...

关于httpClient 使用的注意事项
关于httpClient 使用的注意事项 用例 PoolingHttpClientConnectionManager connectionManager new PoolingHttpClientConnectionManager();// 最大连接数-不设置默认20connectionManager.setMaxTotal(200);// 每个路由最大连接数-不设置默认2connectionManager.setDefaultMax…...

Docker 发布自定义镜像到公共仓库
Docker 发布自定义镜像到公共仓库 引言 Docker 是一种轻量级、便携式的容器化技术,可以使应用程序在不同环境中更加可移植。在本文中,我们将学习如何使用 Docker 从公共仓库拉取 Nginx 镜像,定制该镜像,添加自定义配置文件&…...

程序员有哪些接单的渠道?
这题我会!程序员接单的渠道那可太多了,想要接到合适的单子,筛选一个合适的平台很重要。如果你也在寻找一个合适的接单渠道,可以参考以下这些方向。 首先,程序员要对接单有一个基本的概念:接单渠道可以先粗略…...

服务容错-熔断策略之断路器hystrix-go
文章目录 概要一、服务熔断二、断路器模式三、hystrix-go3.1、使用3.2、源码 四、参考 概要 微服务先行者Martin Fowler与James Lewis在文章microservices中指出了微服务的九大特征,其中一个便是容错性设计(Design for failure)。正如文章中提到的,微服…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...

Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
机器学习的数学基础:线性模型
线性模型 线性模型的基本形式为: f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法,得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...
TCP/IP 网络编程 | 服务端 客户端的封装
设计模式 文章目录 设计模式一、socket.h 接口(interface)二、socket.cpp 实现(implementation)三、server.cpp 使用封装(main 函数)四、client.cpp 使用封装(main 函数)五、退出方法…...
boost::filesystem::path文件路径使用详解和示例
boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类,封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解,包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...