公司网站如何做水印,我想学习做网站,集团网站建设招标,生活服务信息类网站建设文章目录 资源收集文件(.qrc)外部二进制资源内编译(compiled-in)资源压缩使用应用程序中的资源使用库中的资源 Qt资源系统是一种
独立于平台的机制#xff0c;用于在应用程序的可执行文件中存储二进制文件。如果您的应用程序总是需要一组特定的文件(图标、翻译文件等)#x… 文章目录 资源收集文件(.qrc)外部二进制资源内编译(compiled-in)资源压缩使用应用程序中的资源使用库中的资源 Qt资源系统是一种
独立于平台的机制用于在应用程序的可执行文件中存储二进制文件。如果您的应用程序总是需要一组特定的文件(图标、翻译文件等)并且您不想冒丢失文件的风险那么这一点非常有用。 资源系统基于qmake、rcc (Qt的资源编译器)和QFile之间的紧密合作。
资源收集文件(.qrc)
与应用程序关联的资源在**.qrc文件中指定这是一种基于xml的文件格式它列出磁盘上的文件并可选择地为它们分配一个资源名称**应用程序必须使用该名称来访问该资源。
下面是一个.qrc文件例子:
!DOCTYPE RCCRCC version1.0
qresourcefileimages/copy.png/filefileimages/cut.png/filefileimages/new.png/filefileimages/open.png/filefileimages/paste.png/filefileimages/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 aliascut-img.pngimages/cut.png/file文件就可以从应用中通过:/cut-img.png进行访问了。使用qresource 标签的 prefix 属性还可以为 qrc 文件内的所有文件指定路径前缀:
qresource prefix/myresourcesfile aliascut-img.pngimages/cut.png/file
/qresource在这种情况下可以通过:/myresources/cut-img.png访问该文件
有些资源需要根据用户的区域设置进行更改例如翻译文件或图标。这是通过向 qresource 标签添加一个 lang属性并指定一个合适的区域设置字符串来完成的。例如:
qresourcefilecut.jpg/file
/qresource
qresource langfrfile aliascut.jpgcut_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.qrcqmake将生成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.qrcRCC还为您提供了对压缩的一些控制。您可以指定压缩文件时要考虑的压缩级别和阈值级别例如:
rcc -compress 2 -threshold 3 myresources.qrc使用应用程序中的资源
在应用程序中大多数地方都可以使用资源路径而不是普通的文件系统路径。特别是你可以传递一个资源路径而不是文件名给QIcon, QImage或QPixmap构造函数: cutAct new QAction(QIcon(:/images/cut.png), tr(Cut), 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()。