当前位置: 首页 > news >正文

Qt中的RCC

      Qt资源系统(Qt resource system)是一种独立于平台的机制,用于在应用程序中传输资源文件。如果你的应用程序始终需要一组特定的文件(例如图标、翻译文件和图片),并且你不想使用特定于系统的方式来打包和定位这些资源,则可以使用Qt资源系统。

      最常见的情况是,资源文件嵌入到应用程序可执行文件中,或者嵌入到应用程序可执行文件加载的库和插件中。或者,资源文件也可以存储在外部资源文件中。

      资源系统基于Qt的rcc资源编译器(Resource Compiler)、构建系统和Qt运行时API之间的紧密合作。

      注意:目前,Qt资源系统尚未利用任何系统特定的资源处理功能,例如Windows、macOS和iOS上的资源处理功能。这种情况可能会在未来的Qt版本中得到改变。 

      Qt Resource Compiler(rcc)

      (1).rcc命令行工具:用于在构建过程中将资源嵌入到Qt应用程序中,读取资源文件并生成C++或Python源文件,或者生成.rcc文件。rcc.exe位于6.8.0\msvc2019_64\bin,其支持的输入参数如下所示:

      (2).文件列表和相关元数据(metadata)以Qt资源集合文件(Qt Resource Collection File)的形式传递给rcc。

      (3).默认情况下,rcc会生成C++源代码,然后将其编译为可执行文件或库的一部分。"-g python"选项会生成Python源代码。"-binary"选项会生成一个二进制存档,按照惯例,该存档会保存在.rcc文件中,并可在运行时加载。

      (4).注意:虽然可以从命令行运行rcc,但通常最好将其留给构建系统。

      Qt Resource Collection File(.qrc)

      (1)..qrc文件是一个XML文档,其中列举了需要作为运行时资源包含的本地文件。它作为rcc的输入。mainwindow.qrc文件内容示例如下:在vs2022中此文件可以直接使用Qt Resource Editor打开

      (2).XML中的每个<file>元素都标识应用程序源代码树中的一个文件。路径是相对于包含.qrc文件的目录解析的。

      (3).默认情况下,该路径也用于在运行时标识文件的内容。

      (4).Qt Creator、Qt Design Studio、Qt Widgets Designer和Qt Visual Studio Tools允许你通过便捷的用户界面创建、检查和编辑.qrc文件。除了Qt Widgets Designer之外,它们还为使用Qt资源系统的项目提供了向导。

      构建系统集成

      (1).使用rcc处理资源文件通常在应用程序构建时完成。一些构建工具对此提供了专门的支持,包括CMake和qmake。

      (2).如果启用了CMAKE_AUTORCC,你只需将.qrc文件作为源添加到可执行文件或库中即可。引用的资源文件将嵌入到二进制文件中:set(CMAKE_AUTORCC ON)

      (3).AUTORCC的替代方案是使用Qt6Core的CMake函数qt_add_resources,该函数可以更好地控制资源的创建。例如,它允许你直接在项目文件中指定资源的内容,而无需先编写.qrc文件:调用qt_add_resources后会由mainwindow.qrc生成qrc_mainwindow.cpp,内容示例如下:

      Runtime API

      处理迭代和读取文件的Qt API内置了对Qt资源系统的支持。你可以将资源路径(而不是本地文件路径)传递给QFile和QDir,也可以传递给QIcon、QImage和QPixmap等构造函数,如下所示:":"前缀明确表示应从Qt资源系统加载"/images/cut.png"

cutAct = new QAction(QIcon(":/images/cut.png"), tr("Cu&t"), this);

      高级主题

      (1).前缀:.qrc文件可以设置一个前缀,该前缀将添加到<file>元素中指定的每个本地文件名之后,用于获取资源系统中该文件的名称。前缀允许你构建资源结构,避免通过不同库或插件中的不同.qrc文件添加的资源文件之间发生冲突。

      (2).别名:有时,将资源文件在运行时置于其他路径下会很方便。.qrc文件可以通过设置alias属性来实现。

      (3).丢弃文件内容:有时你想将文件节点添加到资源文件系统,但实际上并不想添加文件内容。.qrc文件通过将empty属性设置为true来实现此目的。生成的文件仍然可以从应用程序访问,但其内容为空。这对于从应用程序二进制文件中剥离QML源代码非常有用。

      (4).语言选择器:某些资源需要根据用户的语言环境进行更改,例如翻译文件或图标。资源集合文件通过为qresource标签添加lang属性来支持此功能,该属性指定了合适的语言环境字符串。

      (5).嵌入大文件:默认情况下,rcc会将资源文件以C++数组的形式嵌入到可执行文件中。这对于大型资源尤其容易出现问题。如果编译器运行时间过长,甚至由于内存溢出而失败,你可以选择一种特殊模式,在该模式下,资源将通过两步过程嵌入。C++编译器只会在目标可执行文件或库中为资源预留足够的空间。资源文件内容和元数据的实际嵌入是在编译和链接阶段之后,通过另一个rcc调用完成的。对于CMake,你需要使用qt_add_big_resources函数。

      (6).外部资源文件:除了将资源文件嵌入二进制文件之外,还可以将它们存储在单独的.rcc文件中。rcc允许使用"-binary"选项来实现此目的。此类.rcc文件必须在运行时使用QResource加载。对应CMake,可以使用qt_add_binary_resources函数。

      (7).压缩:rcc会尝试压缩内容,以优化最终二进制文件中的磁盘空间使用率。如果需要,可以关闭压缩功能。

      GitHub:https://github.com/fengbingchun/Qt_Test

相关文章:

  • 滚珠丝杆在工作中损耗会影响什么?
  • python笔记和练习----少儿编程课程【阶段二(二)】
  • spark-哈希join介绍
  • vmware环境ORACLE RAC环境数据库节点1无法启动问题分析处理
  • MAD-TD: MODEL-AUGMENTED DATA STABILIZES HIGH UPDATE RATIO RL
  • 打工人TOP,截图工具天花板
  • SSRF服务端请求伪造
  • 自定义类型-结构体(一)
  • MySQL 索引和事务
  • 开疆智能Profinet转canopen网关连接易福门(IFM)传感器配置案例
  • LintCode第68题-二叉树的前序遍历,第67题-二叉树的后序遍历
  • 构件是一个逻辑概念,还是一个物理概念?
  • 【vite好用的配置】自动导入组件、vue中的hook、路径解析、打包配置、本地运行反向代理配置
  • 如何通过ABAP获取SAP生产订单的目标成本
  • 【无标题】I/O复用(epoll)三者区别▲
  • LeetCode 热题 100 24. 两两交换链表中的节点
  • JS正则表达式介绍(JavaScript正则表达式)
  • AI与机器人学:从SLAM到导航的未来
  • leetcode 2918. 数组的最小相等和 中等
  • Windows右键管理工具:轻松添加/删除/修改右键菜单项!
  • 中方代表团介绍中美经贸高层会谈有关情况:双方一致同意建立中美经贸磋商机制
  • “电竞+文旅”释放价值,王者全国大赛带火赛地五一游
  • 巴基斯坦外长:印巴停火
  • 呼和浩特推进新一轮国企重组整合:杜绝一项目一公司、一业务一公司
  • 拿出压箱底作品,北京交响乐团让上海观众享受音乐盛宴
  • 国办印发《关于进一步加强困境儿童福利保障工作的意见》