Qt:资源系统

1059 篇文章 285 订阅

Qt 资源系统是一个将二进制文件存入可执行程序的平台无关的机制。当你的程序经常需要这样的一系列文件(图标、翻译文件等)并且不想冒丢失某些文件的风险时非常有用。 资源系统基于 qmakercc和 QFile 之间的紧密合作。它废弃了 Qt 3的嵌入工具和 image collection 机制。

资源集合文件( .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 文件所在目录或其子目录

资源数据可以编译成二进制进而在程序代码中立即访问,也可以编译成可以被创建的二进制资源以便稍后在程序代码中登记到资源系统。

  • 默认情况下,程序可以直接使用 ":/" 前缀加与代码树中相同的名字访问资源。例如,:/images/cut.png 可以访问在程序代码树中位置为 images/cut.png 的 cut.png 文件。
  • 用文件标签的别名属性可以改变访问名称:
    <file alias="cut-img.png">images/cut.png</file>

    之后就可以在程序中使用 :/cut-img.png 访问此文件了

  • 还可以使用 qresource 标签的前缀属性为 .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>

如果用户的本地配置是法语(也即 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");

编译嵌入资源

如果需要把资源编译嵌入到二进制文件中, .qrc 文件必须在 .pro 文件中写明以便于 qmake 可以正确处理。例如:

 RESOURCES     = application.qrc

qmake 会产生 make 规则来生成一个链接到程序中的名为 qrc_application.cpp 的文件。这个文件以静态的 C++ 压缩二进制数组包含了所有图片和其他资源的数据。每当 qrc_application.cpp 本身或者是其中引用的资源文件发生改变后,该文件都会被自动重新生成。如果你不使用 .pro 文件,那么可以手工调用 rcc 或者在 build 系统中添加 build 规则。

 

当前,哪怕是在 Windows and Mac OS X 这些原生支持资源机制的操作系统中,Qt 也总是把资源数据存储在可执行文件中。在将来的 Qt 发行版本中可能会有所改变

 

在程序中使用资源

在程序中,多数情况下可以使用资源路径代替对应的正常的普通文件路径。特别地,可以用资源路径取代文件名传递给 QIcon、 QImage ,或者 QPixmap 的构造函数:

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

关于在实际应用程序中使用 Qt 资源系统来存储图标,可以参考 Application 例子.

在内存中,以一颗资源对象树来组织资源。此树在程序启动时被自动生成并且被 QFile 用来定位资源路径。你可以使用带有 ":/" 前缀的 QDir 从根目录开始遍历这棵树。

Qt 资源系统支持搜索路径列表。如果你用 ":" 代替 ":/" 作为前缀,则会使用搜索路径列表来搜索资源。程序启动时搜索路径列表为空,可以用 QDir::addSearchPath() 在其中增加路径。

如果有资源位于静态库中,需要用不带有后缀的 .qrc 文件名为参数调用 Q_INIT_RESOURCE() 来强制初始化资源系统。例如:

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

类似地,如果你需要显式地卸载一系列资源(比如插件被卸载或资源不再有效),你可以用同前的文件名为参数调用 Q_CLEANUP_RESOURCE() ,来强制卸载资源。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值