【Qt App 编译 】Qt Cmake 资源文件的加载:如何使用 CMakeLists.txt 文件和资源文件

简介: 【Qt App 编译 】Qt Cmake 资源文件的加载:如何使用 CMakeLists.txt 文件和资源文件

概述

Qt是一个跨平台的C++应用程序开发框架,提供了丰富的功能和工具来帮助开发者快速开发跨平台应用程序。Qt提供了一种方便的方式来管理和加载应用程序的资源,例如图片、音频、样式表等。在本文中,我们将介绍如何使用Qt6来加载资源文件,包括CMake中加载png文件、css文件和qrc文件,我们还将介绍这些方法和Qt5的不同。


当然,如果你想找的是如何加载外部库,那么可以看这篇文章:CMake 链接外部库


qt_add_resources

qt_add_resources 命令是在 Qt 5 中引入的命令,而 qt5_add_resources 是为了向后兼容而添加的命令。两个命令的作用是相同的,都可以用于将资源文件添加到 Qt 5 应用程序中。
从 Qt 6 开始,qt_add_resources 命令也支持 Qt 6,因此您可以在 Qt 6 中使用 qt_add_resources 命令来嵌入资源文件。


qt5_add_resources

  • 命令
qt5_add_resources(<VAR> file1.qrc [file2.qrc ...]
                  [OPTIONS ...])
  • 描述

使用Resource Compiler(rcc)从Qt资源文件创建源代码。生成的源文件的路径已添加到中。
注意:这是一个低级宏。请参阅CMake AUTORCC文档,以更方便的方式使用来处理Qt资源文件rcc。要嵌入更大的资源,请参见qt5_add_big_resources。

  • 示例
 set(SOURCES main.cpp) 
 qt5_add_resources(SOURCES example.qrc)
 add_executable(myapp ${SOURCES}) 

qt6_add_resources

  • 命令
qt6_add_resources(<TARGET> <RESOURCE_NAME>
                  [PREFIX <PATH>]
                  [LANG <LANGUAGE>]
                  [BASE <PATH>]
                  [OUTPUT_TARGETS <VARIABLE_NAME>]
                  [FILES ...] [OPTIONS ...])
  • 描述

添加资源时,可以将变量名或目标作为命令的第一个参数进行传递。
当传递变量名作为第一个参数时,qt_add_resources使用资源编译器(RCC)从Qt资源文件创建源代码。生成的源文件的路径将添加到。
当将目标作为第一个参数传递时,该函数将创建一个名为resource_name的资源,其中包含指定的文件。资源会自动链接到目标。
要嵌入更大的资源,请参见qt_add_Big_Resources。

  • 示例
qt6_add_resources(RESOURCE_FILES
    images.qrc
    fonts.qrc
    styles.qrc
    OPTIONS
    -binary # 将资源文件打包成二进制数据
    -compress # 压缩资源文件
    -no-compress # 不压缩资源文件
    -prefix /myapp/resources # 指定资源文件的前缀路径
    -root /path/to/resources # 指定资源文件的根目录路径
    -verbose # 显示详细的打包过程信息 )

add_executable(myapp main.cpp ${RESOURCE_FILES})

是否需要加载qrc文件

需要加载qrc的情况

  • 如果编译时没有包含qrc文件且使用的是相对路径(例如“:/style.css”)来加载qss文件,则需要在应用程序中加载.qrc文件才能访问qss文件。

不需要加载qrc的情况

  • 如果使用的是绝对路径来加载qss文件(例如“/path/to/my/qss/file.qss”),则无需加载.qrc文件即可访问qss文件。这是因为绝对路径表示文件系统中的文件路径,而不是qrc文件中的资源路径。
  • 如果CMake项目已经包含了.qrc文件并且正确地配置了Qt Resource System,那么就不需要在应用程序中显式加载.qrc文件或资源。Qt会自动加载并处理资源,可以像使用任何其他资源一样使用它们,例如使用“:/”语法访问qrc中的资源。

C++ 代码加载示例

  • 加载PNG
//注意,在加载PNG文件时,我们使用了一个冒号后跟一个斜杠的前缀(“:/”),这是Qt的资源文件前缀。
//在使用Qt Creator创建Qt项目时,Qt Creator将为您创建一个.qrc文件,其中包含了所有要在应用程序中使用的资源。我们将在后面的部分中更详细地介绍如何使用.qrc文件。
#include <QApplication>
#include <QPixmap>
#include <QLabel> int main(int argc, char *argv[]) 
{
    QApplication app(argc, argv);
    QPixmap pixmap(":/images/image.png");
    QLabel label;
    label.setPixmap(pixmap);
    label.show();
    return app.exec();
}

  • 加载CSS文件
#include <QApplication>
#include <QFile>
#include <QTextStream>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QFile file(":/style/style.css");
    if (file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        QTextStream stream(&file);
        app.setStyleSheet(stream.readAll());
        file.close();
    }

    return app.exec();
}

  • 加载qrc文件


#include <QApplication>
#include <QLabel>
#include <QResource>

int main(int argc, char *argv[])
 {
    QApplication app(argc, argv);
  //QResource类的使用方式类似于在文件系统中访问文件。
    // 加载.qrc文件
    QResource::registerResource("myresources.qrc");

    // 访问.qrc文件中的资源
    QPixmap pixmap(":/images/myimage.png");
    QLabel label;
    label.setPixmap(pixmap);
    label.show();
    //在应用程序退出之前,应使用QResource::unregisterResource()函数注销已加载的.qrc文件
    QResource::unregisterResource("myresources.qrc");

    return app.exec();
 }

Qt6相对于Qt5的一些变化

Qt6和Qt5在加载资源文件方面的区别主要集中在两个方面:资源文件格式和资源加载方式。

  • 资源文件格式:

Qt5中使用的是.qrc格式的资源文件,而Qt6中引入了一种新的.qrcs格式。.qrcs格式与.qrc格式的主要区别在于.qrcs格式可以包含一个或多个文件的元数据,而不是在.qrc文件中为每个文件定义单独的资源标识符。这使得.qrcs格式更容易使用,并且在包含大量文件的资源文件中,可以减少文件大小。

  • 资源加载方式:

在Qt5中,资源文件是在编译时通过rcc工具处理的,然后生成一个C++文件,该文件包含所有资源的二进制数据和访问接口。在运行时,应用程序可以通过调用QResource类的静态函数访问这些资源。
在Qt6中,资源文件加载方式有所改变。Qt6中的资源加载器使用了一种新的资源索引格式(RIFF),并且在运行时动态加载资源。这种方式可以减少应用程序的启动时间,并且可以支持更灵活的资源加载。

  • 优缺点对比:

Qt6的资源文件加载方式具有更好的动态加载能力,可以在需要时按需加载,减少了应用程序的启动时间,同时还可以支持更灵活的资源加载。此外,.qrcs格式也比.qrc格式更易于使用。
然而,这种新的加载方式需要Qt6运行时支持,而Qt5的.rcc加载方式是静态的,不需要额外的库或运行时支持。此外,Qt6中引入的新的.qrcs格式也需要新的rcc工具进行处理,而这种工具在某些环境中可能不可用或需要额外的安装。


Qt 6 和 Qt 5 的资源系统在 API 和功能上存在一些区别

  • 文件名后缀

在 Qt 5 中,资源文件通常使用 .qrc 后缀。而在 Qt 6 中,建议使用 .qtresource 后缀来代替。这样可以更清晰地表示文件的作用,避免与其他文件混淆。
优点:更明确的文件命名,避免了不必要的混淆和错误。

  • 模块名

在 Qt 5 中,资源文件的命名约定为 :///。而在 Qt 6 中,这个约定被取消了。现在你可以使用任何合法的字符串作为模块名。
优点:更灵活的模块命名规则,可以更好地适应各种应用场景。

  • 文件格式

在 Qt 6 中,资源文件格式有了一些变化。现在,Qt 使用一种名为 Resource Compiler 的工具来处理资源文件。这种工具可以将资源文件编译为一种名为 .rcc 的格式,而不是像以前那样打包到可执行文件中。
优点:更快的启动时间,更好的资源管理,更加模块化。

  • 资源文件管理

在 Qt 6 中,资源文件的管理方式也发生了一些变化。现在,你可以使用一种名为 Resource Manager 的工具来管理资源文件,而不是像以前那样使用 qmake 来处理。优点:更加灵活和可扩展的资源管理方式,可以更好地适应各种应用场景。

结语

在我们的编程学习之旅中,理解是我们迈向更高层次的重要一步。然而,掌握新技能、新理念,始终需要时间和坚持。从心理学的角度看,学习往往伴随着不断的试错和调整,这就像是我们的大脑在逐渐优化其解决问题的“算法”。

这就是为什么当我们遇到错误,我们应该将其视为学习和进步的机会,而不仅仅是困扰。通过理解和解决这些问题,我们不仅可以修复当前的代码,更可以提升我们的编程能力,防止在未来的项目中犯相同的错误。

我鼓励大家积极参与进来,不断提升自己的编程技术。无论你是初学者还是有经验的开发者,我希望我的博客能对你的学习之路有所帮助。如果你觉得这篇文章有用,不妨点击收藏,或者留下你的评论分享你的见解和经验,也欢迎你对我博客的内容提出建议和问题。每一次的点赞、评论、分享和关注都是对我的最大支持,也是对我持续分享和创作的动力。

目录
相关文章
|
29天前
|
存储 Java API
Android 浅度解析:mk预置AAR、SO文件、APP包和签名
Android 浅度解析:mk预置AAR、SO文件、APP包和签名
132 0
|
1天前
|
缓存 Android开发 Kotlin
【安卓app开发】kotlin Jetpack Compose框架 | 先用OKhttp下载远程音频文件再使用ExoPlayer播放
使用 Kotlin 的 Jetpack Compose 开发安卓应用时,可以结合 OkHttp 下载远程音频文件和 ExoPlayer 进行播放。在 `build.gradle` 添加相关依赖后,示例代码展示了如何下载音频并用 ExoPlayer 播放。代码包括添加依赖、下载文件、播放文件及简单的 Compose UI。注意,示例未包含完整错误处理和资源释放,实际应用需补充这些内容。
|
1天前
|
IDE Linux 开发工具
在Qt开发环境中qmake和cmake的区别优势
选择qmake还是CMake,主要取决于项目的需求和开发者的熟悉程度。如果你正在开发一个纯Qt项目,或者是一个不需要复杂构建脚本的小型项目,qmake可能是一个更好的选择。反之,如果你的项目需要处理复杂的依赖关系,或者你想要一个在多种编程环境中都能工作的构建系统,那么CMake可能是更好的选择。
13 2
|
2天前
|
存储 Android开发 Kotlin
开发安卓app OKhttp下载后使用MediaPlayer播放
在Android Jetpack Compose应用程序中,要使用OkHttp下载远程音频文件并在本地播放,你需要完成以下几个步骤: 1. **添加依赖**:确保`build.gradle`文件包含OkHttp和Jetpack Compose的相关依赖。 2. **下载逻辑**:创建一个`suspend`函数,使用OkHttp发起网络请求下载音频文件到本地。 3. **播放逻辑**:利用`MediaPlayer`管理音频播放状态。 4. **Compose UI**:构建用户界面,包含下载和播放音频的按钮。
|
7天前
Cmake构建Qt项目链接glog库
Cmake构建Qt项目链接glog库
|
21天前
|
开发工具 iOS开发
如何导出iPhone手机中app共享文件夹的文件与闪退日志的收集
如何导出iPhone手机中app共享文件夹的文件与闪退日志的收集
19 1
|
21天前
|
Perl
pod spec lint编译时报The 'Pods-App' target has transitive dependencies that include static binaries错误问题
pod spec lint编译时报The 'Pods-App' target has transitive dependencies that include static binaries错误问题
23 1
|
23天前
如何在不越狱的情况下,获取app中的所有常用文件和文件夹
如何在不越狱的情况下,获取app中的所有常用文件和文件夹
11 1
|
25天前
|
Web App开发 JSON 小程序
苹果app开发apple-app-site-association文件配置
apple-app-site-association 是苹果的配置文件,用于建立app和网站关联,支持Universal Links,使点击网站链接能直接打开相应app内部页面。配置文件为JSON格式,需上传至服务器`.well-known`目录或根目录。通过检查三个链接来测试配置,确保Content-Type为`application/json`。成功配置后,点击链接能在iPhone备忘录或Safari中直接唤起app,但可能有24-48小时延迟。
58 6
|
29天前
|
Windows
Qt 目录操作(QDir 类)及展示系统文件实战 & QFilelnfo 类介绍和获取文件属性项目实战
Qt 目录操作(QDir 类)及展示系统文件实战 & QFilelnfo 类介绍和获取文件属性项目实战
Qt 目录操作(QDir 类)及展示系统文件实战 & QFilelnfo 类介绍和获取文件属性项目实战

推荐镜像

更多