Qt学习笔记1.3.4 QtCore-Qt资源系统

文章目录

  • 资源收集文件(.qrc)
  • 外部二进制资源
  • 内编译(compiled-in)资源
  • 压缩
  • 使用应用程序中的资源
  • 使用库中的资源

Qt资源系统
Qt资源系统是一种 独立于平台的机制,用于在应用程序的可执行文件中存储二进制文件。如果您的应用程序总是需要一组特定的文件(图标、翻译文件等),并且您不想冒丢失文件的风险,那么这一点非常有用。

资源系统基于qmake、rcc (Qt的资源编译器)和QFile之间的紧密合作。

资源收集文件(.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文件相同的目录中,或者位于它的一个子目录中。

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

默认情况下,应用程序中的资源可以使用与源树中相同的文件名访问,使用:/prefix,或者使用带有qrc方案的URL。
例如,文件路径:/images/cut.png 或URL qrc:///images/cut.png 可以访问程序资源树中位于image/cut.png的文件cut.png这可以使用 file 标签的 alias 属性进行更改:

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

文件就可以从应用中通过:/cut-img.png进行访问了。使用qresource 标签的 prefix 属性还可以为 qrc 文件内的所有文件指定路径前缀:

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

在这种情况下,可以通过:/myresources/cut-img.png访问该文件

有些资源需要根据用户的区域设置进行更改,例如翻译文件或图标。这是通过向 qresource 标签添加一个 lang属性,并指定一个合适的区域设置字符串来完成的。例如:

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

外部二进制资源

要创建外部二进制资源,必须通过将-binary开关传递给rcc来创建资源数据(通常提供.rcc扩展名)。创建二进制资源后,您可以向QResource API注册该资源。

例如,在.qrc文件中指定的一组资源数据可以用以下方式编译:

rcc -binary myresource.qrc -o myresource.rcc

在应用程序中,此资源将使用以下代码进行注册:

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

内编译(compiled-in)资源

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

RESOURCES     = application.qrc

qmake将生成make规则来生成一个名为qrc_application.cpp的文件,该文件链接到应用程序中。这个文件包含图像和其他资源的所有数据,作为压缩二进制数据的静态c++数组。每当.qrc文件或它所引用的文件之一发生变化时,都会自动重新生成qrc_application.cpp文件。如果不使用.pro文件,则可以手动调用rcc或向构建系统添加构建规则。
内编译资源
目前(Qt5.12),Qt总是将数据直接存储在可执行文件中,即使在Windows、macOS和iOS上也是如此,这些操作系统提供了对资源的本地支持。这可能会在未来的Qt版本中改变。

压缩

资源默认被压缩(zip格式)。压缩是可关闭的。如果资源已经包含压缩格式,例如.png文件,那么这可能很有用。可以通过提供-no-compress命令行参数来实现这一点。

rcc -no-compress myresources.qrc

RCC还为您提供了对压缩的一些控制。您可以指定压缩文件时要考虑的压缩级别和阈值级别,例如:

rcc -compress 2 -threshold 3 myresources.qrc

使用应用程序中的资源

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

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

在内存中,资源由资源对象树表示。该树在启动时自动构建,并由QFile用于解析到资源的路径。您可以使用用:/初始化的QDir从根目录开始在资源树中导航

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

使用库中的资源

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

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()。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

信息与未来2017真题笔记

T1. 龟兔赛跑 题目描述 兔子又来找乌龟赛跑啦&#xff01;同样的错误兔子不会犯两次&#xff0c;所以兔子提出赛跑的时候&#xff0c;乌龟就觉得这场比赛很不公平。于是兔子进一步放宽了条件&#xff0c;表示他可以在比赛开始以后先睡 t t t 分钟再开始追乌龟。 乌龟这下没…

java+jsp+sql server 医院住院管理系统论文(二)

⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️ ➡️点击免费下载全套资料:源码、数据库、部署教程、论文、答辩ppt一条龙服务 ➡️有部署问题可私信联系 ⬆️⬆️⬆️​​​​​​​⬆️…

TikTok起号的八大技巧分享

国内的传统生意都是可以在抖音上做&#xff0c;那么也可以在TikTok 上重新做一遍。那该如何才能把握住这片巨大的蓝海&#xff0c;TikTok 账号的运营就成为了主要的关键了&#xff0c;对于TikTok账号运营的八大秘籍&#xff0c;大家一起看看是如何做的&#xff1f; 一、固定节…

机器视觉运动控制一体机在点胶胶路检测上的应用

市场应用背景 点胶通过使用不同类型的粘合剂&#xff0c;实现产品的密封、绝缘、导热和耐腐蚀等作用&#xff0c;广泛应用于各种产品的制造。在点胶加工生产中&#xff0c;通过检测胶水的宽度、点胶位置和胶路连续性等&#xff0c;可确保产品性能的可靠性和稳定性。 在现实生…

骨传导耳机哪个品牌值得入手?盘点5款高人气热门机型推荐!

随着人们对健康生活方式的追求和户外运动的普及&#xff0c;骨传导耳机的需求也日益增长。然而&#xff0c;随着骨传导耳机的热度增加&#xff0c;市场上也开始出现一些低质量的骨传导耳机产品&#xff0c;这些劣质耳机在音质、佩戴舒适度或安全性上存在各种不足&#xff0c;甚…

Dubbo全局处理业务异常 (自定义dubbo异常过滤器)

自定义dubbo异常过滤器 一、前置问题介绍&#xff1a;问题一问题二 二、Dubbo的异常过滤器源码如下&#xff1a;三、实现方案 - 重写Dubbo的Filter异常过滤器至此&#xff0c;Dubbo自定义异常过滤器已完结&#xff01; 一、前置问题介绍&#xff1a; 问题一 在dubbo框架中&am…

多臂老虎机

多臂老虎机 有n根拉杆的的老虎机&#xff0c;每根拉杆获得奖励(值为1)的概率各不相同。 期望奖励更新 Q k 1 k ∑ i 1 k r i 1 k ( r k ∑ i 1 k − 1 r i ) 1 k ( r k k Q k − 1 − Q k − 1 ) Q k − 1 1 k [ r k − Q k − 1 ] Q_k\frac 1k \sum^{k}_{i1}r_i\\…

oracle10g dbca和netca报错

oracle10g dbca和netca报错 [oraclecqnew database]$ netcaOracle Net Services Configuration: Warning: Cannot convert string "-b&h-lucida-medium-r-normal-sans-*-140-*-*-p-*-iso8859-1" to type FontStruct Configuring Listener:LISTENER不影响使用&am…

一键监控多台服务器磁盘使用情况的神奇脚本!

在当今这个数据为王的时代&#xff0c;服务器的磁盘空间使用情况成为了系统管理员日常关注的重要指标之一。磁盘空间不足可能导致服务中断&#xff0c;数据丢失&#xff0c;甚至整个系统崩溃。因此&#xff0c;及时监控磁盘空间&#xff0c;预防潜在风险&#xff0c;成为了每个…

上下左右翻转照片以及标注信息扩充数据集

目录 前言&#xff1a; 示例项目数据结构&#xff1a; 源代码&#xff1a; 运行代码后生成的项目结构&#xff1a; 效果&#xff1a; 前言&#xff1a; 使用yolo训练模型时&#xff0c;遇到数据集很小的情况&#xff08;一两百张&#xff09;&#xff0c;训练出来的模型效…

2024年电工杯数学建模B题思路 中国电机工程学会杯建模思路分析

文章目录 1 赛题思路2 比赛日期和时间3 竞赛信息4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

四天学会JS高阶(学好vue的关键)——作用域解构箭头函数(理论+实战)(第一天)

一、作用域 提到作用域&#xff08;作用域又分为局部作用域和全局作用域&#xff09;&#xff0c;就要想到变量。因为作用域规定了变量能够被访问的范围&#xff08;也就是作用域是为变量而服务的&#xff09;&#xff0c;为了避免全局变量污染这一情况&#xff0c;所以需要使…

关闭 Visual Studio Code 项目中 的eslint的语法校验 lintOnSave: false;; 项目运行起来之后 自动打开浏览器 端口

1、在 vue.config.js 配置 一个属性 lintOnSave: false 2、配置两个属性 open: true, // 自动打开浏览器 port: 3000 // 端口 port 端口号根据自己的项目实际开发来 配置

C++类细节,反汇编,面试题02

文章目录 2. 虚函数vs纯虚函数3. 重写vs重载vs隐藏3.1. 为什么C可以重载&#xff1f; 4. struct vs union4.1. 为什么要内存对齐&#xff1f; 5. static作用6. 空类vs空结构体6.1. 八个默认函数&#xff1a;6.2. 为什么空类占用1字节 7. const作用7.1 指针常量vs常量指针vs常量…

用友网络的危与机:2023年亏损约10亿元,王文京面临严肃拷问

“企业在新的产业浪潮来临时&#xff0c;应该主动推进新阶段的产品和业务创新&#xff0c;这样才能够在新的浪潮成为主流的时候&#xff0c;走到行业前面&#xff0c;否则就会从产业发展的潮流中掉下来”。用友网络创始人王文京&#xff0c;曾用“冲浪理论”形容一家企业成功的…

国内好用的测试用例管理工具有哪些?

目前市面上的测试用例管理工具有很多&#xff0c;但由于针对的项目、领域、目标用户&#xff0c;功能也并不一致&#xff0c;所以选择一款适合的测试管理平台并不轻松。做好这件事&#xff0c;首先要需求明确你用测试管理工具干什么&#xff1f;最终想要达到什么目标&#xff1…

C语言学习(八)typedef 虚拟内存 malloc/free

目录 一、typedef 类型重定义&#xff08;一&#xff09;使用&#xff08;二&#xff09;define和typedef的区别1. 编译处理的阶段不同2. 功能不同 二、虚拟内存&#xff08;一&#xff09;虚拟内存分布&#xff08;二&#xff09;内存分布1. 静态分配2. 动态分配 三、malloc/f…

用sunoAI写粤语歌的方法,博主已经亲自实践可行

粤语歌还是很好听的&#xff0c;那么如何使用suno进行粤语歌的创作呢&#xff1f; 本文和大家进行分享下如何进行粤语歌曲的创作。 访问地址如下&#xff08;电脑端/手机端一个地址&#xff09;&#xff1a; ​https://suno3.cn/#/?i8NCBS8_WXTT 在微信浏览器中也可以直接…

RT-DETR改进教程|加入SCNet中的SCConv[CVPR2020]自校准卷积模块!

⭐⭐ RT-DETR改进专栏|包含主干、模块、注意力机制、检测头等前沿创新 ⭐⭐ 一、 论文介绍 论文链接&#xff1a;http://mftp.mmcheng.net/Papers/20cvprSCNet.pdf 代码链接&#xff1a;https://gitcode.com/MCG-NKU/SCNet/ 文章摘要&#xff1a; CNN的最新进展主要致力于设计更…

文字转成活码的3步操作,手机扫码即可查看文本信息

现在经常会通过二维码的方式来传递通知的文字信息&#xff0c;只需要分享文字生成二维码的图片到微信群或者印刷出来&#xff0c;其他人就可以通过扫码来查看文字内容&#xff0c;有利于其他人更快速的获取信息。 目前文本静态码无法通过微信来扫码展示&#xff0c;那么想要解…