使用 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.qmlqrc:///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.在芬兰及/或世界其他国家的商标。所有其他商标均为其所有者的财产。