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文件和资源的管理。

Qt项目构建
设置CMake和项目
查找Qt5组件
设置自动MOC, RCC, UIC
添加可执行文件
链接Qt库

2.qmake与cmake的差异

  • qmake
  1. 专注于Qt:qmake是Qt框架的一部分,主要用于构建使用Qt的应用程序。它天生支持Qt的各种特性,如信号和槽、国际化、资源文件等。
  2. 配置简单:对于纯Qt项目,qmake的配置文件(.pro文件)通常更简单,更易于编写和维护。
  3. 跨平台:虽然qmake支持跨平台构建,但其核心功能主要集中在Qt应用程序上。
  4. 限制:qmake在非Qt项目的通用性和灵活性方面受到限制,特别是在处理复杂构建场景时。
  • CMake
  1. 通用性:CMake是一个更通用的构建系统工具,适用于各种C++项目,包括但不限于Qt应用程序。
  2. 高度灵活:CMake提供了更多的高级特性和更大的灵活性来处理复杂的构建需求。
  3. 广泛支持:CMake得到广泛的支持和使用,是许多开源项目和大型应用程序的首选构建系统。
  4. 学习曲线:由于其功能丰富和灵活性高,CMake的学习曲线可能会比qmake陡峭。
  5. 跨平台构建:CMake在处理跨平台构建方面表现更好,支持生成多种IDE和构建系统的工程文件。
  6. 集成和扩展: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: 提供串口通信功能

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

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

相关文章

关于“Python”的核心知识点整理大全63

目录 20.2.11 使用 Git 跟踪项目文件 1. 安装Git 2. 配置Git 3. 忽略文件 .gitignore 注意 4. 提交项目 20.2.12 推送到 Heroku 注意 20.2.13 在 Heroku 上建立数据库 20.2.14 改进 Heroku 部署 1. 在Heroku上创建超级用户 注意 注意 20.2.11 使用 Git 跟踪项目文件…

Ubuntu22.04,Nvidia4070配置llama2

大部分内容参考了这篇非常详细的博客&#xff0c;是我最近看到的为数不多的保姆级别的教学博客&#xff0c;建议大家去给博主点个赞【Ubuntu 20.04安装和深度学习环境搭建 4090显卡】_ubuntu20.04安装40系显卡驱动-CSDN博客 本篇主要是基于这篇博客结合自己配置的过程中一些注…

计算机二级WPS Office考试须知、如何备考、备考建议

本文从计算机二级考试须知、如何备考、备考建议以及考试的注意事项等方面进行讲述&#xff0c;认认真真看&#xff0c;对你受益匪浅。 一、计算机二级考试须知 2021年3月27日至29日将举办第60次全国计算机等级考试&#xff08;NCRE&#xff09;&#xff0c;从今年起&#xff0…

C# 使用Fleck创建WebSocket服务器

目录 写在前面 代码实现 服务端代码 客户端代码 调用示例 写在前面 Fleck 是 C# 实现的 WebSocket 服务器&#xff0c;通过 WebSocket API&#xff0c;浏览器和服务器只需要做一个握手的动作&#xff0c;然后浏览器和服务器之间就形成了一条快速通道&#xff1b;两者之间…

十大开放式耳机品牌哪个好?开放式耳机详细评测攻略分享,精华篇

相信很多朋友在选购开放式耳机的时候&#xff0c;发现市场上的开放式耳机品牌琳琅满目&#xff0c;完全不清楚哪家的产品更胜一筹&#xff0c;有些人甚至跟风购入&#xff0c;因此很容易买到不合适自己的而踩雷。 其实这种耳机我很早之前就有在使用&#xff0c;我对于耳机数码类…

【人工智能Ⅰ】实验11:支持向量机

实验11 支持向量机 一、实验目的 1&#xff1a;了解支持向量机的结构和原理。 2&#xff1a;应用支持向量机建立训练模型&#xff0c;对模型进行评估。 二、实验内容和要求 【实验内容】 选择支持向量机&#xff0c;对花卉图像或玉米果穗图像进行分类。花卉图像包括玫瑰&a…

详解ajax、fetch、axios的区别

众所周知它们都用来发送请求&#xff0c;其实它们区别还蛮大的。这也是面试中的高频题&#xff0c;本文将详细进行讲解。 1. ajax 英译过来是Aysnchronous JavaScript And XML&#xff0c;直译是异步JS和XML&#xff08;XML类似HTML&#xff0c;但是设计宗旨就为了传输数据&a…

Android14之解决Pixel手机联网出现感叹号(一百八十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

景联文科技:以高质量数据赋能文生图大模型

1月5日&#xff0c;在智求共赢・中国AIGC产业应用峰会暨无界AI生态合作伙伴大会上&#xff0c;中国AIGC产业联盟联合无界AI发布了《中国AIGC文生图产业白皮书2023》&#xff0c;从AIGC文生图发展历程、主流工具、产业实践以及规模预测等多个维度&#xff0c;全面揭示了中国AIGC…

Vue中的class和style绑定

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介动态绑定class对象语法数组语法 动态绑定style对象语法多重值 ⭐ 写在最后 ⭐ 专栏简介 Vue学习之旅的奇妙世界 欢迎大家来到 Vue 技能树参考资料专栏&#xff01;创建这个专栏的初衷是为了帮助大家更好地应对 Vue.js 技能树的学习…

TS 36.331 V12.0.0-过程(2)-连接控制(3)-RRC连接释放

​本文的内容主要涉及TS 36.331&#xff0c;版本是C00&#xff0c;也就是V12.0.0。

Spring MVC 的RequestMapping注解

RequestMapping注解 使用说明 作用&#xff1a;用于建立请求URL和处理请求方法之间的对应关系。 出现位置&#xff1a; 类上&#xff1a; 请求 URL的第一级访问目录。此处不写的话&#xff0c;就相当于应用的根目录。写的话需要以/开头。它出现的目的是为了使我们的 URL 可以…

Web实战丨基于django+html+css+js的学院门户网站

文章目录 写在前面项目概述基本信息项目需求 项目框架程序设计运行结果项目总结 写在后面 写在前面 本期内容&#xff1a;基于DjangoHtmlCssJavaScript的学院门户网站 项目需求&#xff1a; pythondjango 项目下载地址&#xff1a;https://download.csdn.net/download/m0_6…

JAVA课程设计--类京东购物车设计

目录 小组成员 负责模块&#xff1a; 程序介绍&#xff1a; 1.前期调查&#xff1a; 1.1京东购物车页面 首页 购物车界面 商品信息界面 搜索界面 1.2程序设计页面 首页 购物车页面 商品信息界面 搜索界面&#xff1a; 2.使用环境&#xff1a; 3.技术支持 前端V…

Provide/Inject 依赖注入(未完待续)

父组件传递给子组件数据&#xff0c;通过props&#xff0c;但是需要逐层传递 provide/Inject 的推出就是为了解决这个问题&#xff0c;它提供了一种组件之间共享此类值的方式,不必通过组件树每层级显示地传递props 目的是为了共享那些被 认为对于一个组件树而言是全局的数据 p…

海外代理IP在游戏中有什么作用?

随着科技的飞速发展&#xff0c;手机和电脑等电子产品已成为互联网连接万物的重要工具&#xff0c;深度融入我们的日常生活&#xff0c;我们借助互联网完成工作、休闲和购物等任务&#xff0c;以求提升生活质量。 不仅如此&#xff0c;网络游戏也是人们心中最爱&#xff0c;它…

【51单片机】独立按键控制LED灯

不同于上篇文章只用代码控制&#xff0c;这次我们要再加上独立按键一同控制LED灯 目录 独立按键控制LED亮灭&#xff1a;代码实现&#xff1a; 独立按键控制LED状态&#xff1a;代码实现&#xff1a; 独立按键实现二进制LED显示&#xff1a;代码实现&#xff1a; 独立按键控制…

cpp_10_多重继承_钻石继承_虚继承

1 多重继承 一个类可以同时从多个基类继承实现代码。 1.1 多重继承的内存布局 子类对象内部包含多个基类子对象。 按照继承表的顺序依次被构造&#xff0c;析构的顺序与构造严格相反。 各个基类子对象按照从低地址到高地址排列。 // miorder.cpp 多重继承&#xff1a;一个子…

跑代码相关 初始环境配置

是看了这个视频&#xff1a;深度学习python环境配置_哔哩哔哩_bilibili 总结的个人笔记 这个是从零开始配python环境的比较好的经验教程&#xff1a; 深度学习python的配置&#xff08;Windows&#xff09; - m1racle - 博客园 (cnblogs.com) 然后关于CUDA和cuDNN&#xff…

武汉灰京文化:跨平台游戏的崛起,破壁无界,畅游全场!

随着科技的飞速发展&#xff0c;游戏平台之间的界限逐渐模糊&#xff0c;许多优秀的游戏已经不再只局限于单一的游戏设备平台。无论你身处何处&#xff0c;只要有网络连接&#xff0c;你就可以随时随地畅玩自己喜欢的游戏&#xff0c;而无需更换设备或重新安装&#xff0c;这无…