Qt资源系统(The Qt Resource System)

Qt资源系统允许开发者在应用程序的可执行文件中存储二进制资源,确保它们总是可用且不会丢失。资源通过.qrc文件定义,这些文件是XML格式,列出需要打包的文件。资源在运行时通过QFile和QResource访问,可以压缩并根据用户语言环境调整。资源编译成二进制文件,通过qmake和rcc工具处理,并在应用程序启动时自动加载。这确保了资源在不同平台上的统一管理和访问。
摘要由CSDN通过智能技术生成

Qt资源系统是一种与平台无关的机制,用于在应用程序的可执行文件中存储二进制文件。如果您的应用程序始终需要一组特定的文件(图标,翻译文件等),并且您不想冒丢失文件的风险,这将很有用。
资源系统基于qmake,rcc(Qt的资源编译器)和QFile之间的紧密合作。
资源收集文件(.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。可以使用文件标签的别名属性来更改此设置:

<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访问该文件。
有些资源需要根据用户的语言环境进行更改,例如翻译文件或图标。这是通过将lang属性添加到qresource标记,并指定合适的语言环境字符串来完成的。例如: 

<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文档。
有关选择操作系统特定的功能和其他功能的信息,请参见QFileSelector以了解选择特定于语言环境的资源的其他机制。
外部二进制资源
对于要创建的外部二进制资源,必须通过将-binary开关传递给rcc来创建资源数据(通常使用.rcc扩展名)。创建二进制资源后,您可以使用QResource API注册该资源。
例如,可以通过以下方式来编译.qrc文件中指定的一组资源数据:

 rcc -binary myresource.qrc -o myresource.rcc

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

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

编译资源
为了将资源编译成二进制文件,必须在应用程序的.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以压缩格式存储文件时必须获得的原始文件大小的百分比。

默认值为“ 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:使用https://zstd.net库压缩内容。有效压缩级别的范围是1到19,1是最小压缩(最少的CPU时间),而19是最大压缩(最多的CPU时间)。默认级别为14。特殊值0告诉zstd库选择实现定义的默认值。
  • zlib:使用https://zlib.net库压缩内容。有效压缩级别的范围是1到9,压缩率最小(CPU时间最少)为1,压缩率最大(CPU时间最多)为9。特殊值0表示“无压缩”,不应使用。默认值是实现定义的,但通常是级别6。
  • 无:无压缩。这与-no-compress选项相同。

对Zstandard和zlib的支持是可选的。如果在编译时未检测到给定的库,则尝试为该库传递-compress-algo将会导致错误。如果启用了默认压缩算法,则为zstd;如果未启用,则为zlib。
在应用程序中使用资源
在应用程序中,资源路径可以在大多数地方使用,而不是普通的文件系统路径。特别是,您可以将资源路径而不是文件名传递给QIcon,QImage或QPixmap构造函数:     

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

有关使用Qt资源系统存储其图标的实际应用程序,请参见应用程序示例。
在内存中,资源由资源对象树表示。该树在启动时自动构建,并由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()。

Resource Compiler (rcc)

rcc工具用于在构建过程中将资源嵌入到Qt应用程序中。它通过生成包含Qt资源(.qrc)文件中指定的数据的C ++源文件来工作。
用法:

 rcc [options] <inputs>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道格拉斯范朋克

播种花生牛奶自留田

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值