学习自

Qt 资源系统(Qt Resource System) - 知乎

1、什么是Qt 资源系统

Qt资源系统是一种将图片、数据存储于二进制文件中的一套系统。这些图片、数据会被我们的程序使用,它们称为资源。Qt资源系统中存储了这些资源,使得程序可以很方便地找到并使用它们。

Qt资源系统是独立于平台的,因为无论是文件还是翻译文件,都会被打包成为二进制数据。我们可以把这些二进制数据保存到可执行文件中,这种做法称为静态加载资源;也可以把它们单独保存在某个文件中,称为动态加载资源。

2、qrc文件

qrc文件是基于XML格式的资源系统配置文件(注意是配置文件而不是资源文件本身),其中指定了各种资源的信息。

将资源文件打包为二进制数据的流程是:

写qrc文件 → 用rcc编译 → 二进制数据

2.1、写qrc文件

两种方式:

  • 用Qt Creator编写;
  • 手工写。

这里之所以有“手工写”,是因为Qt Creator只支持一次生成一个qrc文件,如果我们需要多个qrc文件或者一个qrc文件下的多个目录,那么需要多次同样的操作,费时费力。遇到这种情况,可以在命令行中列出所有文件,复制粘贴到某个文本编辑器中,然后多行同时添加前缀后缀,就像这样:

手工写qrc文件需要熟悉qrc文件的规则,这一点听起来要学习很多东西,实际上可以先用Qt Creator写好一个qrc文件之后照着它的样式写就可以了。所以这里只说明如何用Qt Creator写qrc文件:

①在项目中添加Qt Resource File,命名为resource(名字随意),完成后就得到了一个空的qrc文件:resource.qrc。此时文件中还没有资源信息,只有两行简单的标识符:

这里有一点需要注意,如果直接双击qrc文件,打开之后可能是这样:

这时是以资源编辑器的形式打开的,如果要进入文本编辑器模式,只需要右键qrc文件,以文本编辑器模式打开

②我们在工程目录(即.pro所在目录)下创建一个pic文件夹用于存放资源文件,比如这里我们存放了三个图片:pic1.jpg、pic2.jpg、pic3.jpg

③在Qt Creator中打开qrc 资源编辑器,第一步永远是添加前缀,如/logo(如果不写任何前缀,则会默认生成一个单斜杠 前缀,最后访问该前缀下的资源文件时,写法就是qrc:///资源文件名,第二个斜杠表示这个默认前缀目录,这样的话可读性不高。),然后才是添加资源文件:

最后,我们在文本编辑器中查看,就可以看到①中所说的两行标识符没有了,剩下的全是包含前缀的资源信息了:

2.2、前缀、别名、语言环境

在创建qrc文件的过程中,有前缀、别名、适用的语言环境这些项,我们只是设置了前缀,其它两项都没有管。其实,这些项的本质是分组。

这里终点说下语言环境,语言环境是和前缀一起设置的。有时我们的同一个图标可能因为国家原因做了不同的版本,Qt可以自动根据本机语言环境选择性地加载不同的图标。

比如,这里我又多了一个文件pic2_fr.jpg,并且把它的别名设置为pic2.jpg。前缀都是logo,只是后者的语言环境属性为fr。这意味着,当我本机是法语时,程序会从第二个前缀中找到叫pic2.jpg的文件:

2.3、两种资源路径

假设已经加载好了资源,访问这些资源的两种方式是:

  • 文件路径—— :/pic/pic1.png,即 :/资源路径(相对于工程目录)
  • URL—— qrc:///pic/pic1.png,即 qrc:///资源路径(相对于工程目录)

3、如何加载资源

两种方式:

  • 将资源存储到可执行文件中(静态方式);
  • 将资源存储在单独的二进制文件中并由可执行文件调用(动态方式)。

3.1、静态方式

除了用Qt Creator在工程中添加qrc文件外,还需要在.pro文件中加入qrc文件,以便qmake可以识别资源文件,不过这一步是由Qt Creator自动完成的。

qmake编译后会生成一个名为qrc_resource.cpp的文件,打开它之后我们会看到刚才我们的资源已经以静态数组的形式保存在其中了。最终该文件的数据会存入可执行文件中。

3.2、动态方式

不需要写pro文件,需要手动用rcc工具编译qrc文件,然后用QResource类加载。

1)手动用rcc编译qrc文件;

rcc -binary resource.qrc -o resource.rcc

2)在程序中用QResource类加载。

QResource::registerResource("/path/resource.rcc");

备注:rcc工具的使用,请自行参考官方文档"Resource Compiler (rcc)"。

4、在lib库中使用资源

一般我们写完 lib 库后提供给外界的就是一个库文件和头文件,所以无论你是在库中使用资源还是给外界提供资源,最好是采用静态方式。不然的话你还得额外提供 rcc 文件,即独立的二进制资源文件。

将资源存储于 lib 库中,需要调用 Q_INIT_RESOURCE() 宏来强制资源初始化。反之如果卸载资源则调用 Q_CLEANUP_RESOURCE(),例如:

MyClass::MyClass():BaseClass()
{
Q_INIT_RESOURCE(resources);
QFile file(":/myfile.dat");
...
}

注意:在程序而不是库中,如果采用静态方式,不需要使用Q_INIT_RESOURCE() 和 Q_CLEANUP_RESOURCE()。

Qt:Qt资源系统的更多相关文章

  1. Qt之资源系统

    简述 Qt 的资源系统用于存储应用程序的可执行二进制文件,它采用平台无关的机制.当你的程序总需要这样的一系列文件(图标.翻译文件等)并且不想冒丢失某些文件的风险时,这就显得十分有用. 资源系统基于 q ...

  2. QT中自定义系统托盘的实现—c++语言为例

    将要介绍的是:QT中自定义系统托盘(systemtray)的一个Demo,希望能帮需要的读者快速上手. 前提假设是诸位已经知道QT中的signals .slot以及资源文件,所以关于这些不会再累述. ...

  3. 学习Qt的资源-网站、论坛、博客等

    来自<零基础学Qt 4编程>一书的附录 附录C Qt资源 C.1 Qt 官方资源 全球各大公司以及独立开发人员每天都在加入 Qt 的开发社区.他们已经认识到了Qt 的架构本身便可加快应用程 ...

  4. C、C++、boost、Qt在嵌入式系统开发中的使用

    概述 嵌入式系统开发相对来说属于偏底层的开发,也就是与硬件结合比较紧密,只能使用C/C++语言.对于做平台开发的人来说,C语言真的是很"古老"的语言,属于操作系统语言!好多人会觉得 ...

  5. 【转载】分享一些Qt学习资源,欢迎下载

    资源来源:http://bbs.csdn.net/topics/390358737 经过我一翻整理,把一些我收集到的Qt学习资源分享给大家,主要适合新手,老鸟可以直接忽略我.要说明一下,很多资源都是在 ...

  6. QT的Paint 系统

    下面对于QT的绘制系统做一个简要说明, 这个系统主要由三部分组成,  QPainter, QPaintDevice, QPaintEngine. QPainter 是一个绘制接口类,提供绘制各种面向用 ...

  7. QT下资源使用和资源占用…(可以动态加载资源文件,这样不占内存)

    原文地址:关于QT下资源使用和资源占用内存过多的问题作者:技术成就梦想     最近研究了一下如何从外部动态调用图片的问题,从而研究了图片资源的使用方法.网上最常见的帖子是这个,感觉总结的还不错. h ...

  8. 关于QT下资源使用和资源占用…

    原文地址:关于QT下资源使用和资源占用内存过多的问题作者:技术成就梦想     最近研究了一下如何从外部动态调用图片的问题,从而研究了图片资源的使用方法.网上最常见的帖子是这个,感觉总结的还不错. h ...

  9. 解析Qt元对象系统(五) Q_INVOKABLE与invokeMethod(automatic connection从Qt4.8开始的解释已经与之前不同,发送对象驻足于哪一个线程并不重要,起到决定作用的是接收者对象所驻足的线程以及发射信号(该信号与接受者连接)的线程是不是在同一个线程)good

    概述查看Qt源码可知,Q_INVOKABLE是个空宏,目的在于让moc识别. 使用Q_INVOKABLE来修饰成员函数,目的在于被修饰的成员函数能够被元对象系统所唤起. Q_INVOKABLE与QMe ...

随机推荐

  1. ansible roles实践——服务器初始化

    1.服务器初始化可以做哪些工作 关闭selinux ntp同步时间 修改dns为自建dns 配置ssh互信 修改yum源 设置主机名 内核参数优化 安装jdk 2.roles编写

  2. Nginx代理常用参数

    目录 一:Nginx代理常用参数 1.添加发往后端服务器的请求头信息 二:参数案例 1.lb01配置文件 2.web01 web02 web服务器 3.测试 4.重启 5.DNS域名解析 6.网址测试 ...

  3. 阿里智能运维实践|阿里巴巴DevOps实践指南

    编者按:本文源自阿里云云效团队出品的<阿里巴巴DevOps实践指南>,扫描上方二维码或前往:https://developer.aliyun.com/topic/devops,下载完整版电 ...

  4. C++ STL:std::unorderd_map 物理结构详解

    拉链法的 unordered_map 和你想象中的不一样 根据数组+拉链法的描述,我们很快能想到下面这样的拉链法实现的哈希表,但真的是这样吗?一起看下源码里的实现是怎么样的. 深入STL源码 代码不会 ...

  5. Linux 配置 mycat 和 分库分表配置。

    Linux 如何配置mycat? 3.配置mycat 3.1.规定linux的用户名和全名不能叫mycat!!!否则mycat会不生效(原因是影响整个linux系统的环境变量导致mycat的配置环境变 ...

  6. plsql 带参数的游标

    -- 带参数的游标 -- cursor c(no emp.deptno%type) is select * from emp where deptno=no; 参数的起名 不要和表中的列名相同! -- ...

  7. CNN-卷积神经网络简单入门(1)

    卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习 ...

  8. Atcoder ARC-068

    A 不难发现从 \(5\) 开始一直往 \(6\) 转再转回来是最优的,直接模拟即可. B 不难发现可以将多余部分直接贪心消去,最后必然会剩下两个或 \(1\) 个多余的数. 如果剩下两个,此时多余的 ...

  9. textarea自适应高(宽)度

    转载请注明来源:https://www.cnblogs.com/hookjc/ 方法一: <textarea rows=1 cols=40 style='overflow:scroll;over ...

  10. Android使用pull解析xml格式的数据

    dom解析:基于全文加载的解析方式   sax解析:基于事件的逐行解析方式  pull解析:同sax              XmlPullParser     //解析xml文件读取短信内容    ...