自学内容网 自学内容网

[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

原文地址:https://blog.csdn.net/qq_44723937/article/details/140587890

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!