使用 Qt 资源

Qt 资源系统 允许您将文件存储在程序的执行文件中。在某种程度上,这个功能类似于一个专用文件系统,我们称之为 资源文件系统。通常,这个文件系统包含 QML 代码和其他资产,如图像。如果您使用 QML 编译器,编译后的代码始终放在资源文件系统中。有一些特定于应用程序管理器的考虑因素,尤其是在您的应用程序需要支持单进程和多进程模式时。

编译资源

您可以将资源作为 外部二进制资源 或作为 嵌入资源 添加;两者都是从 .qrc 文件生成的。通常,外部二进制资源存储在扩展名为 .rcc 的文件中,而嵌入资源存储在应用程序管理器上下文中的库中。

重要的是要理解每个进程都有自己的资源文件系统。因此,为了支持多进程模式,资源必须单独为系统 UI 和每个应用程序生成。相反,在单进程模式下,只有一个资源文件系统,您必须确保文件路径不冲突。为了防止冲突,我们建议在应用程序文件路径前加上唯一的应用程序 ID。

考虑以下应用程序文件结构

apps
|---- app1
|     |---- main.qml
|     |---- app1.qrc
|     ...
|---- app2
|     |---- main.qml
|     |---- app2.qrc
|     ...

没有前缀的情况下,在单进程模式下,`main.qml` 文件会发生冲突。为了避免这种情况,app1 的 `.qrc` 文件应如下所示

<!DOCTYPE RCC><RCC version="1.0">
<qresource prefix="app1">
    <file>main.qml</file>
</qresource>
</RCC>

对于 `app2`,前缀应该是 "app2"。一般来说,任何 `.qrc` 文件中包含的所有文件都应该是唯一的;这还包括系统 UI 使用的文件。

加载资源

除了在 Qt 资源系统 中描述的方法之外,应用程序管理器还提供配置选项来加载资源,包括外部二进制资源以及以库形式嵌入的资源。

假设您有一个 `my.rcc` 二进制文件和一个 `myplugin.so` 库文件。您可以通过向 `am-config.yaml` 文件添加以下行将这些文件加载到系统 UI 中

ui:
  resources: [ "${CONFIG_PWD}/my.rcc",
               "${CONFIG_PWD}/myplugin.so" ]

您也可以通过向 `info.yaml` 文件添加以下片段将这些两个文件加载到应用程序中

runtimeParameters:
  resources: [ "my.rcc",
               "myplugin.so" ]

资源在系统 UI 启动时加载,在 QML 引擎实例化之前。在多进程模式下,应用程序资源也在应用程序启动时加载到应用程序进程中。在单进程模式下,资源在应用程序第一次启动时加载,并在后续调用中重复使用;它们从不卸载。

使用资源

应用程序管理器允许通过 URL 方案(`qrc`)或文件名前缀(`:`)在资源文件系统中进行文件访问。这两种选项都需要资源文件系统中的绝对文件路径,例如

  • qrc:/app1/main.qmlqrc:///app1/main.qml
  • :/app1/main.qml

虽然 Qt 应用程序管理器接受这种宽松的命名结构,但 QML 引擎区分 URL 和文件名。例如,一个 图像源 属性仅接受 `qrc` 方案。

若要指定相对路径,请不要使用方案或文件路径前缀。

如果你的文件未在资源文件系统中找到,你可以使用以下代码片段列出整个资源文件系统的内容

QDirIterator it(qSL(":"), QDirIterator::Subdirectories);
while (it.hasNext()) {
    const QString fn = it.next();
    if (!fn.startsWith(qSL(":/qt-project.org")))  // exclude Qt internal files
        qDebug() << fn;
}

©2019 Luxoft Sweden AB。本文件中包含的文档贡献是各自所有者的版权。本文件中的文档按照自由软件基金会发布的GNU自由文档许可协议版本1.3的条款进行许可。Qt及其相应的标志是芬兰Qt公司及其它全球地区的商标。所有其他商标均为其各自所有者的财产。