qt 资源在 qml 中使用资源的正确形式是什么 qrc:///bg.png vs ../bg.png
qt resources what is the correct form to use resource in 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 不显示背景图像,但在预览或模拟器中工作
第二个 qtcreator 在设计模式下显示图像并在预览中工作
还有这种形式:
Image {
id: bg
anchors.bottomMargin: 60
anchors.fill: parent
source: "qrc:/assets/img/drawable-hdpi/bg.png"
}
在预览中工作,但设计模式下的 qtcreator 不显示 bg.png
我在一些 qtblog post 中读到,如果您想使用缓存或类似的想法,您需要将资源用作 qrc:// 但我现在找不到 link。
但我想知道什么是最好的形式,以及在设计模式下使用 qrc:// qtcreator 无法显示资源的原因。
Qt 资源编译器 (qrc
) 生成包含二进制文件的 C 文件,然后将这些文件编译并链接到 executable,Qt 中不涉及二进制数据缓存.
您用来访问资源的路径没有区别performance-wise:如果一些 top-level QML 文件是使用绝对 qrc://
协议加载的,那么所有具有相对路径将从编译到 executable 的资源中加载,而不是从 OS 文件系统加载(这会失败,因为这些文件在执行时不在 build/installation 文件夹中executable 运行)。
因为 executable 通常是 memory-mapped(as-if 你在 executable 文件上做了 mmap
),访问资源大约是与访问 memory-mapped 文件的内容一样快,即可能是通过 OS 访问任何内容的最快方式。路径与它关系不大。
当然要解析路径,但是成本比较低。我没有检查过这个,但是 Qt 的 qrc "filesystem" 实现可以散列 URI 并将这些散列与资源 table 匹配,并且只有在失败时才解析路径 - 但我不确定除非您使用的是非常 resource-constrained 的系统,否则任何性能改进都是值得的。现在,如果这种散列行为是 API 的一部分(即已记录 Qt 必须以这种方式行事),那么设计您的软件以利用它是明智的,以免过早悲观。如果没有这样的 API 保证,我不会担心,因为无论 micro-optimization 你基于实现细节做什么,都可能在下一个 Qt 版本中使事情变得更糟。
早上好,我有一个问题要问 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 不显示背景图像,但在预览或模拟器中工作
第二个 qtcreator 在设计模式下显示图像并在预览中工作
还有这种形式:
Image {
id: bg
anchors.bottomMargin: 60
anchors.fill: parent
source: "qrc:/assets/img/drawable-hdpi/bg.png"
}
在预览中工作,但设计模式下的 qtcreator 不显示 bg.png
我在一些 qtblog post 中读到,如果您想使用缓存或类似的想法,您需要将资源用作 qrc:// 但我现在找不到 link。
但我想知道什么是最好的形式,以及在设计模式下使用 qrc:// qtcreator 无法显示资源的原因。
Qt 资源编译器 (qrc
) 生成包含二进制文件的 C 文件,然后将这些文件编译并链接到 executable,Qt 中不涉及二进制数据缓存.
您用来访问资源的路径没有区别performance-wise:如果一些 top-level QML 文件是使用绝对 qrc://
协议加载的,那么所有具有相对路径将从编译到 executable 的资源中加载,而不是从 OS 文件系统加载(这会失败,因为这些文件在执行时不在 build/installation 文件夹中executable 运行)。
因为 executable 通常是 memory-mapped(as-if 你在 executable 文件上做了 mmap
),访问资源大约是与访问 memory-mapped 文件的内容一样快,即可能是通过 OS 访问任何内容的最快方式。路径与它关系不大。
当然要解析路径,但是成本比较低。我没有检查过这个,但是 Qt 的 qrc "filesystem" 实现可以散列 URI 并将这些散列与资源 table 匹配,并且只有在失败时才解析路径 - 但我不确定除非您使用的是非常 resource-constrained 的系统,否则任何性能改进都是值得的。现在,如果这种散列行为是 API 的一部分(即已记录 Qt 必须以这种方式行事),那么设计您的软件以利用它是明智的,以免过早悲观。如果没有这样的 API 保证,我不会担心,因为无论 micro-optimization 你基于实现细节做什么,都可能在下一个 Qt 版本中使事情变得更糟。