Qt扫盲-Qt资源系统概述

news2024/9/27 19:19:43

Qt资源系统概述

  • 一、概述
  • 二、资源文件(.qrc)
  • 三、外部二进制资源
  • 四、内嵌资源
  • 五、压缩资源文件
  • 六、在应用中使用资源
  • 七、使用Library 库中的资源

一、概述

Qt资源系统是一种独立于平台的机制,用于在应用程序的可执行文件中存储二进制文件。如果您的应用程序总是需要一组特定的文件(图标、翻译文件等),我们就可以用这个资源系统来把这些要用的资源给组织起来,然后再我们的应用程序调用,这个资源可以一起打包到应用程序内部,或者编译成一个二进制文件,动态的加载到应用程序里面,在换皮肤等方面用的比较多。

资源系统与 qmake、rcc (Qt的资源编译器) 和 QFile 都关系密切。

这种资源系统一般就是在 Qt Creator 里面以 .qrc 文件,当然这个文件也是文本的。
在这里插入图片描述

二、资源文件(.qrc)

与应用程序关联的资源在.qrc文件中指定,该文件是一种基于xml的文件格式,列出磁盘上的文件,并可选地为它们分配应用程序访问资源时必须使用的资源名称。这个还可以给每个资源去别名之类的。
在这里插入图片描述

下面是一个例子。qrc文件:

<!DOCTYPE RCC><RCC version="1.0">
  <qresource>
      <file>images/copy.png</file>
      <file>images/cut.png</file>
      <file>images/new.png</file>
      <file>images/open.png</file>
      <file>images/paste.png</file>
      <file>images/save.png</file>
  </qresource>
</RCC>

.qrc文件中列出的资源文件是应用程序源码的一部分。指定的路径是相对于包含.qrc文件的目录。注意,列出的资源文件必须位于与.qrc文件相同的目录中,或者它的子目录之一。

资源数据可以被编译成二进制,从而立即在应用程序代码中访问,也可以创建二进制资源,然后在稍后的应用程序代码中注册到资源系统。

默认情况下,应用程序中的资源可以在与源码相同的文件名下访问,使用 :/前缀 或使用 qrc方案的URL。

例如,文件路径 :/images/cut.png 或 URL qrc:///images/cut.png 将提供对cut.png文件的访问,该文件在应用程序的源码中的位置是 images/cut.png。这也可以使用文件标记的别名来更改,:

也可以理解 images/cut.png 是文件相对于 qrc 资源文件在操作系统里的路径的位置,cut-img.png就是别名

 <file alias="cut-img.png">images/cut.png</file>

然后可以从应用程序中用 :/cut-img.png 别名的形式访问该文件。也可以使用qresource标签的prefix属性为.qrc文件中的所有文件指定路径前缀,在本例中,该文件可以通过 :/myresources/cut-img.png 访问。

  <qresource prefix="/myresources">
      <file alias="cut-img.png">images/cut.png</file>
  </qresource>

有些资源需要根据用户的语言环境进行更改,例如翻译文件或图标。这是通过向qresource标记添加lang属性,指定合适的语言环境字符串来实现的。例如:

<qresource>
      <file>cut.jpg</file>
  </qresource>
  <qresource lang="fr">
      <file alias="cut.jpg">cut_fr.jpg</file>
</qresource>

如果用户的语言环境是法语(即 QLocale::system().name() 返回“fr_FR”),:/cut.jpg 将成为对 cut_fr.jpg 图像的引用。对于其他地区,使用 cut.jpg。

有关用于区域设置字符串的格式的描述,请参阅QLocale文档。

三、外部二进制资源

对于要创建的外部二进制资源,必须通过将-binary开关传递给rcc来创建资源数据(通常给出.rcc扩展名)。一旦创建了二进制资源,就可以用QResource API注册该资源。
例如,在.qrc文件中指定的一组资源数据可以通过以下方式编译:

rcc -binary myresource.qrc -o myresource.rcc

在应用程序中,这个资源将像这样用代码注册:

QResource::registerResource("/path/to/myresource.rcc");

注册之后我们就可以一样的在程序里正常的引用这个 资源文件里的内容, 就像下面这种

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

四、内嵌资源

要将资源编译成二进制文件,必须在应用程序的.pro文件中提到.qrc文件,以便qmake知道它。例如:

RESOURCES     = application.qrc

Qmake 将生成 make 规则来生成一个名为 qrc_application.cpp 的文件,该文件被链接到应用程序中。该文件包含图像和其他资源的所有数据,作为压缩二进制数据的静态 c++ 数组。当 .qrc 文件更改或它引用的某个文件更改时, qrc_application.cpp 文件将自动重新生成。如果您不使用.pro文件,您可以手动调用rcc或向构建系统添加构建规则。
在这里插入图片描述

目前,Qt总是将数据直接存储在可执行文件中,即使在Windows、macOS和iOS上,操作系统也为资源提供了本地支持。这可能会在未来的Qt发行版中改变。

五、压缩资源文件

RCC尝试压缩内容以优化最终二进制文件中的磁盘空间使用。默认情况下,它将执行启发式检查,以确定压缩是否值得,如果压缩不够,则存储未压缩的内容。要控制阈值,可以使用-threshold选项,该选项告诉rcc必须获得原始文件大小的百分比,以便以压缩形式存储文件。

rcc -threshold 25 myresources.qrc

默认值为70,即压缩后的文件大小必须小于原始文件大小的70%(不超过原始文件大小的30%)。

如果需要,可以关闭压缩。如果您的资源已经包含压缩格式,例如.png文件,并且您不想在构建时因确认它不能压缩而招致CPU成本,那么这可能很有用。另一个原因是,如果磁盘使用不是问题,应用程序希望在运行时将内容保持为干净的内存页。可以通过命令行参数-no-compress来实现。

rcc -no-compress myresources.qrc

RCC还允许用户对压缩级别和压缩算法进行一些控制,例如:

rcc -compress 2 -compress-algo zlib myresources.qrc

RCC支持以下压缩算法和压缩级别:

  • best:使用以下算法中最好的算法,以最高的压缩级别实现最高的压缩效果,但代价是在编译期间使用大量CPU时间。这个值在XML文件中很有用,它表明一个文件应该被压缩得最多,而不管rcc支持哪种算法。
  • zstd:使用Zstandard库压缩内容。有效的压缩级别从1到19,1是最少压缩(最少CPU时间),19是最多压缩(最多CPU时间)。默认级别为14。一个特殊的值0告诉zstd库选择一个实现定义的默认值。
  • zlib:使用Zlib库压缩内容。有效的压缩级别从1到9,1是最少压缩(最少CPU时间),9是最多压缩(最多CPU时间)。特殊值0表示“不压缩”,不应该使用。默认是实现定义的级别,但通常是6级。
  • none:不压缩。这与 -no-compress 选项的作用相同。

Zstandard 和 zlib 的支持是可选的。如果在编译时没有检测到给定的库,尝试为该库传递 -compress- algorithm 将导致错误。如果启用,默认压缩算法为zstd,否则为zlib。

六、在应用中使用资源

在应用程序中,大多数地方都可以使用资源路径而不是普通的文件系统路径。特别地,您可以将资源路径而不是文件名传递给QIcon、QImage或QPixmap构造函数:

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

请参阅应用程序示例,了解使用Qt资源系统存储图标的实际应用程序。
在内存中,资源由资源对象组成的树表示。该树在启动时自动构建,QFile使用它来解析资源的路径。你可以使用一个用“: /” 初始化的QDir来从根目录导航到资源码。

Qt的资源支持搜索路径列表的概念。如果你使用 : 而不是 😕 作为前缀来引用资源,则会使用搜索路径列表来查找资源。搜索路径列表在启动时是空的;调用QDir::addSearchPath()来添加路径。

七、使用Library 库中的资源

如果库中有资源,则需要使用 .qrc 文件的 文件名 调用 Q_INIT_RESOURCE() 来强制初始化资源。例如:
// resources.qrc

MyClass::MyClass() : BaseClass()
{
      Q_INIT_RESOURCE(resources);

      QFile file(":/myfile.dat");
      ...
}

在静态链接的情况下,这可以确保将资源链接到最终的应用程序二进制文件中。你应该把初始化代码放在库中使用资源的地方,这样库的客户端只有在使用依赖这些资源的库的特性时才会链接这些资源。

注意:由于rcc生成的资源初始化程序是在全局命名空间中声明的,因此对 Q_INIT_RESOURCE() 的调用也需要在任何命名空间之外进行。

如果库包含内部不使用的资源,而是暴露给库的客户端,则需要在应用程序代码中进行初始化。例如:

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

      QFile file(":/graph.png");
      ...
      return app.exec();
}

和之前一样,在静态链接的情况下,这确保了资源被链接到最终的应用程序二进制文件中,但在动态链接的情况下,也会触发库的加载。

类似地,如果必须显式卸载一组资源(因为正在卸载插件或资源不再有效),可以调用与上面相同的基本名称Q_CLEANUP_RESOURCE() 强制删除资源。

注意:当资源作为应用程序的一部分构建时,不需要使用Q_INIT_RESOURCE() 和 Q_CLEANUP_RESOURCE()。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/186895.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot学习之集成Dubbo+Zookeeper小案例

文章目录一 框架搭建1. [Dubbozookeeper下载和安装](https://blog.csdn.net/yang2330648064/article/details/128790320)二 项目创建2.1 服务者部分2.2 消费者部分2.3 注意点2.3.1 在service的实现类中配置服务注解&#xff0c;发布服务&#xff01;注意导包问2.3.2 服务接口的…

[Vulnhub] DC-8

下载链接&#xff1a;https://download.vulnhub.com/dc/DC-8.zip 知识点&#xff1a; sqlmap 注入出用户名密码msfvenom 生成脚本msf反弹shellsuid-exim 提权 目录 <1> 信息搜集 <2> 反弹shell (1) 利用kali自带webshell代码 (2) msfvenom制作反弹shell脚本…

SaaS平台数据表单组件设计技巧分享

SaaS平台数据表单组件设计技巧分享&#xff0c;数据表单方法&#xff1a;固定表头、固定侧栏、自定义栏、分页器、过滤器、数据排序、多选项同时操作、简单且简约、普通的字体样式、项目链接、鼠标悬停设计指南&#xff0c;为大家提供有关数据表单设计的实用性建议。在实际的数…

20克拉默法则、逆矩阵、体积

本节是关于行列式的最后一课&#xff0c;主要包括按各方面&#xff1a;求逆矩阵、克莱姆法则和体积 求逆矩阵 A-1 早在之前&#xff0c;就已经了解过求解逆矩阵的方法&#xff1a;高斯-若尔当求逆法。高斯-若尔当求逆法对于数值计算无懈可击&#xff0c;但很难想象这是如何做…

Hadoop基础之《(6)—Hadoop单机伪集群安装》

一、安装JDK yum install java-1.8* 二、关闭防火墙 systemctl status firewalld systemctl stop firewalld systemctl disable firewalld 三、配置ip地址和主机名映射 vi /etc/hosts 加入&#xff1a; 192.168.1.1 hadoop001 四、配置免密登录 1、生成公私钥 ssh-key…

设计模式第5式:装饰器模式

前言 当我们初学编程时&#xff0c;扩展程序功能一般习惯使用继承&#xff0c;使用继承有一些缺点&#xff0c;那就是容易造成类爆炸&#xff0c;并且容易继承一些不需要的特性。当我们学习完装饰器模式后&#xff0c;会发现善用组合会有比继承更好的效果。 正文 1、咖啡馆案…

全志A40i+Logos FPGA开发板(4核ARM Cortex-A7)硬件说明书(上)

前 言 本文档主要介绍TLA40iF-EVM工业评估板硬件接口资源以及设计注意事项等内容。 核心板的ARM端和FPGA端的IO电平标准一般为3.3V,上拉电源一般不超过3.3V,当外接信号电平与IO电平不匹配时,中间需增加电平转换芯片或信号隔离芯片。按键或接口需考虑ESD设计,ESD器件选型时需…

深入Java自动化探针技术的原理和实践

转至作者 蒋志伟&#xff1a;深入Java自动化探针技术的原理和实践 前言建议阅读时间 30~40分钟读者需要对Java JVM 一定了解&#xff0c;文章会系统的介绍Java 探针核心原理和技术实现&#xff0c;总结目前一些主流的框架方案。同时&#xff0c;接下来我会分享一篇关于 OpenTel…

你是如何学会正则表达式的?

前言 前言 正则表达式作为对字符串操作的一种逻辑公式&#xff0c;它使用一些特定字符及其组合组成“规则字符串”来对字符串进行过滤的操作&#xff0c;如在注册验证的时候我们就经常会用到正则表达式&#xff0c;但正则表达式的变式太多&#xff0c;我们不用完全的去记住每一…

XSSed通关教程

XSSed通关教程 首先整体浏览网站 进入Level1 Basic XSS 首先整体浏览网站 对源码进行分析 漏洞产生于如下代码段&#xff1a; echo($_GET[‘q’]); 直接将用户输入插入了html页面&#xff0c;没有任何过滤。 构造普通payload&#xff1a; <script>alert(/xss/)<…

剑指 Offer II 004. 只出现一次的数字

题目链接 剑指 Offer II 004. 只出现一次的数字 mid 题目描述 给你一个整数数组 nums&#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 示例 1&#xff1a; 输入&#xff1a;nums [2,2,3,2] 输出&…

LeetCode042之接雨水(相关话题:动态规划,单调栈)

题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,…

vue复习+vuex

一、vue.js的基本指令1、Vue的作用&#xff1a;快速的构建前端页面&#xff08;封装了html、css、js&#xff09;,以工程化的方式进行前端的开发2、Vue的核心&#xff1a;&#xff08;1&#xff09;组件化&#xff1a;&#xff08;2&#xff09;数据双向绑定&#xff08;3&…

linux基本功系列之sudo命令实战一

文章目录一.sudo命令介绍二. 语法格式及常用选项三. sudo配置文件详解3.1 sudo的配置文件3.2 配置文件注释3.3 sudo授权规则四. sudo常用参数实战 参考案例4.1 查看当前用户有哪些被sudo服务授权的命令4.2 结束密码的有效期4.3 限制用户的权限总结前言&#x1f680;&#x1f68…

3分钟解读ISO27001信息安全管理体系

一、什么是ISO27001 ISO27001是信息安全管理体系认证&#xff0c;对应国标号GB/T22080-2016&#xff0c;企业建立ISO27001体系能有效保证企业在信息安全领域的可靠性&#xff0c;降低企业泄密风险&#xff0c;更好的保存核心数据和重要信息。 信息安全对每个企业都是非常重要的…

Spring Cloud 高频面试题25连环炮!

今天给大家分享SpringCloud高频面试题。 Spring Cloud核心知识总结 下面是一张Spring Cloud核心组件关系图&#xff1a; 从这张图中&#xff0c;其实我们是可以获取很多信息的&#xff0c;希望大家细细品尝。 话不多说&#xff0c;我们直接开始 Spring Cloud 连环炮。 连环…

【算法基础】链表与邻接表

在机试、面试中,使用链表通常不是结构体构建Node,申请新节点new操作,因为速度过慢,申请10w量级的空节点就已经超时了。因为在算法竞赛中,常常使用 一、数组模拟单链表【⭐邻接表(n个链表)⭐】 邻接表(n个链表)最主要的应用是存储图和存储树。 建表、插入、删除操作…

ThinkPad R490电脑开机之后无线重启怎么重装系统?

ThinkPad R490电脑开机之后无线重启怎么重装系统&#xff1f;有用户使用ThinkPad R490电脑正常开机的情况下&#xff0c;出现了系统自动重启的情况&#xff0c;无法正常的使用电脑了。遇到这个情况怎么去重装一个新的电脑系统&#xff0c;恢复正常使用呢&#xff1f;来看看以下…

17. datetime模块

python 标准库中的 datetime 模块提供了和日期和时间相关的类。 类功能datetime.date以年、月和日表示日历中的日期datetime.time以小时、分钟和秒表示一天中的时间datetime.datetime以年、月、日、小时、分钟和秒表示日期和时间datetime.timedelta表示一个时间段&#xff0c;…

什么蓝牙耳机便宜音质好?平价高音质蓝牙耳机推荐

随着蓝牙耳机的品类越来越多&#xff0c;人们在选择时有了更大的空间。作为蓝牙耳机选择的两大参考要素&#xff0c;性价比和音质的出现频率相对来说会比较高。那么&#xff0c;什么蓝牙耳机便宜音质好&#xff1f;下面&#xff0c;我来给大家推荐几款平价高音质的蓝牙耳机&…