qt - 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 无法显示资源的原因。
解决方案
Qt 资源编译器 ( qrc
) 生成包含二进制文件的 C 文件,然后将这些文件编译并链接到可执行文件中,并且 Qt 中不涉及二进制数据的缓存。
用于访问资源的路径在性能方面没有任何影响:如果使用绝对协议加载某些顶级 QML 文件qrc://
,则所有具有相对路径的子文件将从编译到可执行文件的资源中加载,而不是从操作系统文件系统(这会失败,因为在可执行文件运行时这些文件不在构建/安装文件夹中)。
由于可执行文件通常是内存映射的(就像您mmap
对可执行文件执行了 a 一样),访问资源的速度与访问内存映射文件的内容差不多,即可能是通过操作系统访问任何内容的最快方式。路径与它关系不大。
当然,路径必须被解析,但成本相对较低。我还没有检查过,但是 Qt 的 qrc“文件系统”实现可以散列 URI 并将这些散列匹配到资源表,并且仅在失败时解析路径 - 但我不确定是否有任何性能改进除非您使用的是资源非常有限的系统,否则值得。现在,如果这种散列行为是 API 的一部分(即记录表明 Qt 必须以这种方式运行),那么设计您的软件以利用它是谨慎的,以免过早地悲观。在没有这样的 API 保证的情况下,我不会担心,因为无论您基于实现细节所做的任何微优化,都可能在下一个 Qt 版本中使情况变得更糟。
推荐阅读
- r - 使用 groupby 另一列填充缺失的日期
- mongodb - 我不明白其他人如何在我的 mongodb 中制作集合
- php - 无法通过 php api 登录到 ftp 服务器,但通过 FileZilla 可以正常工作
- react-native - 在 React Native 中关闭应用程序时如何触发 UI 操作?
- api - grafana- 从仪表板获取值,使用 mysql 作为 API 的数据源
- c# - 使用针对 signalR 端点的不同策略覆盖全局 CORS 策略
- c# - 不确定代码是否并行运行。控制台应用程序中的任务
- vue.js - 为什么动态组件在 vue3 中不起作用?
- c++ - 你可以在一个库中实现多个头文件吗?
- laravel - 在私有存储桶中托管亚马逊 s3 上的上传,从 Laravel 中访问 url