使用 Qt 资源
Qt 资源系统允许您将文件存储到程序的可执行文件中。在某种程度上,这个特性类似于一个专用文件系统,我们称之为资源文件系统。通常,这个文件系统包含 QML 代码和其他资产,如图像。如果您使用 QML 编译器,编译后的代码始终放置在资源文件系统中。这导致了一些针对应用程序管理器的特定考虑,尤其是在您的应用程序需要支持单进程和多进程模式时。
编译资源
您可以将资源添加为外部二进制资源或作为嵌入资源;都可以从 .qrc
文件生成。通常,外部二进制资源存储在扩展名为 .rcc
的文件中,而嵌入资源存储在应用程序管理器上下文中的库中。
了解以下事实很重要:每个进程都有自己的资源文件系统。因此,为了支持多进程模式,系统 UI 和每个应用程序的资源都必须单独生成。相反,在单进程模式中,只有一个资源文件系统,您必须确保文件路径不冲突。为了防止冲突,我们建议您在每个应用程序文件路径前加上唯一的应用程序 ID。
考虑以下应用程序文件结构
apps |---- spaceinvaders | |---- main.qml | |---- spaceinvaders.qrc | ... |---- grandtheftdolphin | |---- main.qml | |---- grandtheftdolphin.qrc | ...
在没有前缀的情况下,在单进程模式下,main.qml
文件将发生冲突。为了避免这种情况,spaceinvaders 的 .qrc
文件应如下所示:
<!DOCTYPE RCC><RCC version="1.0"> <qresource prefix="spaceinvaders"> <file>main.qml</file> </qresource> </RCC>
对于 grandtheftdolphin
,前缀应为 "grandtheftdolphin" 分别。通常,任何 .qrc
文件中包含的所有文件都应该是唯一的;这也包括系统 UI 使用的文件。
当直接添加资源而不使用 .qrc
文件时,例如当定义 QML 模块时,应设置 RESOURCE_PREFIX
。
qt_add_qml_module(spaceinvaders URI "SpaceInvaders" RESOURCE_PREFIX spaceinvaders QML_FILES main.qml )
加载资源
除了在 Qt 资源系统 中描述的方法外,应用程序管理器还提供配置选项来加载资源,即外部二进制资源和以库形式嵌入的资源。
假设您有一个 my.rcc
二进制文件和一个 myplugin.so
库文件。可以将这些文件添加到系统 UI 中,通过将以下行添加到 am-config.yaml
文件中:
ui: resources: [ "${CONFIG_PWD}/my.rcc", "${CONFIG_PWD}/myplugin" ]
如您所见,可以省略库文件的扩展名。您也可以通过将以下代码片段添加到 info.yaml
文件中来将这两个文件添加到应用程序中:
runtimeParameters: resources: [ "my.rcc", "myplugin.so" ]
资源在System UI启动时加载,在实例化QML引擎之前。在多进程模式下,应用程序资源也在启动时加载到应用程序进程中。在单进程模式下,资源在应用程序首次启动时加载,并在后续调用中复用;它们永远不会卸载。
访问资源
应用程序管理器允许在资源文件系统中访问文件,无论是使用URL方案(qrc
)还是文件名前缀(:
)。这两种选项都需要在资源文件系统中使用绝对文件路径,例如
qrc:/spaceinvaders/main.qml
或qrc:///spaceinvaders/main.qml
:/spaceinvaders/main.qml
虽然Qt应用程序管理器接受这种宽松的命名结构,但QML引擎会将URL和文件名区分开来。例如,一个图像源属性仅接受qrc
方案。
如果你要指定相对路径,不要使用方案或文件路径前缀。
如果你的文件没有在资源文件系统中找到,你可以使用以下代码片段列出整个资源文件系统的内容
QDirIterator it(u":"_s, QDirIterator::Subdirectories); while (it.hasNext()) { const QString fn = it.next(); if (!fn.startsWith(u":/qt-project.org"_s)) // exclude Qt internal files qDebug() << fn; }
© 2024 The Qt Company Ltd. 本文档中包含的贡献是相应所有者的版权。本提供的文档根据自由软件基金会发布的GNU自由文档许可证的第1.3版条款进行授权。Qt及其相应标志是The Qt Company Ltd.在芬兰及/或世界其他国家的商标。所有其他商标均为其所有者的财产。