[11 Qt CMake开发]

Qt CMake开发

众所周知,Qt有着自己的构建系统——QMake,但是在Qt6,Qt官方更推荐使用CMake作为项目的构建工具,并且CMake在跨平台方面支持的比较好,大多数IDE也能够支持CMake。在QMake迁移到CMake的过程中,有些同学可能会不知从何下手。所以本文简单的介绍一下:如何使用CMake来开发Qt软件。

文中介绍的方法均只在Windows下验证过。

Qt模块的引入

对于Qt中的不同模块,其实也就是引入不同的库,所以,大致流程和引入库的基本一致。根据Qt官方提供的示例,引入一个模块主要有几个步骤:

  1. 为了让CMake能够找到Qt的模块,需要设置环境变量CMAKE_PREFIX_PATH
  2. 使用find_package命令,来寻找Qt的库。命令具体描述参考官方文档
  3. 使用target_link_libraries将库链接至当前目标。

以下以Qt6为例

set(QT_DIR "D:/xxx/Qt/6.6.1/msvc2019_64/lib")
# 使用list,临时在环境变量CMAKE_PREFIX_PATH中加入QT_DIR
list(APPEND CMAKE_PREFIX_PATH ${QT_DIR})

find_package(Qt6 REQUIRED COMPONENTS Core Widgets Gui)

target_link_libraries("target_name" Qt6::Core Qt6::Widgets Qt6::Gui)

资源文件(qrc)

CMAKE_AUTORCC

话不多说,直接说解决方案:

set(CMAKE_AUTORCC ON)

set(OTHER_FILES main.cpp)

# 添加将资源文件
add_executable(${PROJECT_NAME} ${OTHER_FILES} xxx.qrc)

其他加载资源文件的方式

像上面的这种方法,会将资源文件编译到exe里面,会导致软件的大小,“看起来”比较大。并且也不能像动态库一样,在不重新编译软件的情况下,进行资源的替换。幸运的是,Qt提供了一套注册资源的方法,支持在运行时加载和卸载资源。函数原型为:

[static] bool 
QResource::registerResource(const QString &rccFileName, 
                            const QString &mapRoot = QString())

[static] bool 
QResource::unregisterResource(const QString &rccFileName,
                              const QString &mapRoot = QString())

具体文档描述,可参看Qt在线文档:registerResourceunregisterResource
第一个参数为rccFileName,也就是说需要加载的是rcc而非qrc,但是rcc是二进制文件,而我们创建和编辑的都是qrc文件,那怎么将qrc文件转换成rcc文件呢?
这里就要用到qt自带的rcc工具:rcc.exe,具体的命令为:

rcc.exe xxx.qrc --binary xxx.rcc

最终,加载资源的步骤为:

  1. 调用qt的rcc工具,将qrc编译成二进制rcc文件。
  2. 在软件运行时,调用QResource::registerResource,加载到指定的rcc文件。

如需卸载资源文件,Qt也提供一个API用来卸载资源QResource::unregisterResource,通过这种方法,即可在软件运行期间,实现资源文件的加载和卸载。

UI文件

对于UI文件,想要加载到项目中,主要有两个步骤:

  1. 设置CMAKE_AUTOUICON
  2. 使用add_executable,将UI文件加入编译中,命令详细介绍参看官方文档

具体CMake命令如下:

set(CMAKE_AUTOUIC ON)
add_executable (XXX "test.ui")

MOC文件

同样,对于Qt中的moc处理,CMake也提供了很方便的处理方式:

set(CMAKE_AUTOMOC ON)

参考链接

在写这篇博客的过程中,也是笔者自己查漏补缺的过程,主要参考了下面几篇文章,感谢!

  1. 一文搞懂如何在CMake中使用Qt
  2. Getting started with CMake
  3. CMake Document
  4. 探索qrc,rcc和CMAKE_AUTORCC

相关推荐

  1. 4.11 驱动开发

    2024-07-22 02:28:03       32 阅读
  2. [11 Qt CMake开发]

    2024-07-22 02:28:03       28 阅读
  3. win11开启copilot

    2024-07-22 02:28:03       39 阅读
  4. 【云开发笔记No.11】再说Git

    2024-07-22 02:28:03       39 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-22 02:28:03       103 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-22 02:28:03       114 阅读
  3. 在Django里面运行非项目文件

    2024-07-22 02:28:03       93 阅读
  4. Python语言-面向对象

    2024-07-22 02:28:03       99 阅读

热门阅读

  1. 显示隐式-》初始化 & 类型转换

    2024-07-22 02:28:03       26 阅读
  2. ReentrantLock源码

    2024-07-22 02:28:03       26 阅读
  3. 向量数据库Milvus

    2024-07-22 02:28:03       30 阅读
  4. 在 ASP.NET Core Web API 中实现审计跟踪

    2024-07-22 02:28:03       21 阅读
  5. leetcode-56. 合并区间

    2024-07-22 02:28:03       25 阅读
  6. 后端开发: 如何去使用公共组件

    2024-07-22 02:28:03       24 阅读
  7. 初步认识css(1)

    2024-07-22 02:28:03       24 阅读
  8. C++ Primer:4.4 赋值运算符

    2024-07-22 02:28:03       29 阅读
  9. ubuntu 上安装软件

    2024-07-22 02:28:03       27 阅读
  10. ubuntu系统下安装配置 8.0.37的MySQL

    2024-07-22 02:28:03       25 阅读
  11. Keras和Pytorch输入图像的张量维度

    2024-07-22 02:28:03       29 阅读