文章目录
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 gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = MyQtProject
TEMPLATE = app
SOURCES += main.cpp
FORMS += 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包
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: 提供串口通信功能