首页 > 解决方案 > qt 资源 在 qml qrc:///bg.png vs ../bg.png 中使用资源的正确形式是什么

问题描述

早上好,我有一个问题要问 qt 专家,我想知道在 qrc 中使用资源的正确形式和最佳性能,例如我有:

1-

    Image {
        id: bg
        anchors.bottomMargin: 60
        anchors.fill: parent
        source: "qrc:///assets/img/drawable-hdpi/bg.png"
    }

2-

    Image {
        id: bg
        anchors.bottomMargin: 60
        anchors.fill: parent
        source: "../assets/img/drawable-hdpi/bg.png"
    }

设计模式下的第一个 qtcreator 不显示 bg 图像,但在预览或模拟器中工作

设计模式下的第二个 qtcreator 显示图像并在预览中工作

也有这种形式:

    Image {
        id: bg
        anchors.bottomMargin: 60
        anchors.fill: parent
        source: "qrc:/assets/img/drawable-hdpi/bg.png"
    }

在预览中工作,但设计模式下的 qtcreator 不显示 bg.png

我在一些 qtblog 帖子中读到,如果你想使用缓存或类似的想法,你需要使用资源作为 qrc://,但我现在找不到链接。

但我想知道什么是最好的形式,以及在设计模式下使用 qrc:// qtcreator 无法显示资源的原因。

标签: qtqmlqresource

解决方案


Qt 资源编译器 ( qrc) 生成包含二进制文件的 C 文件,然后将这些文件编译并链接到可执行文件中,并且 Qt 中不涉及二进制数据的缓存。

用于访问资源的路径在性能方面没有任何影响:如果使用绝对协议加载某些顶级 QML 文件qrc://,则所有具有相对路径的子文件将从编译到可执行文件的资源中加载,而不是从操作系统文件系统(这会失败,因为在可执行文件运行时这些文件不在构建/安装文件夹中)。

由于可执行文件通常是内存映射的(就像您mmap对可执行文件执行了 a 一样),访问资源的速度与访问内存映射文件的内容差不多,即可能是通过操作系统访问任何内容的最快方式。路径与它关系不大。

当然,路径必须被解析,但成本相对较低。我还没有检查过,但是 Qt 的 qrc“文件系统”实现可以散列 URI 并将这些散列匹配到资源表,并且仅在失败时解析路径 - 但我不确定是否有任何性能改进除非您使用的是资源非常有限的系统,否则值得。现在,如果这种散列行为是 API 的一部分(即记录表明 Qt 必须以这种方式运行),那么设计您的软件以利用它是谨慎的,以免过早地悲观。在没有这样的 API 保证的情况下,我不会担心,因为无论您基于实现细节所做的任何微优化,都可能在下一个 Qt 版本中使情况变得更糟。


推荐阅读