资源加载与网络透明性

关于通过网络加载文件和资源

QML通过使用URL(而不是文件名)来支持网络透明性,用于从QML文档到其他内容的所有引用。这意味着在任何需要URL源的地方,QML都可以处理远程资源以及本地资源,例如在以下图像源中:

由于相对 URL 与相对文件相同,因此在常规文件系统上开发 QML 仍然很简单:

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 中:

图像源属性将被分配为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代码:

这相当于下载并执行“http://evil.com/evil.exe”。QML引擎不会阻止加载特定资源。与在网页浏览器中运行的JavaScript代码不同,QML应用程序可以像任何其他本地应用程序一样加载远程或本地文件系统资源,因此应用程序开发人员在加载和执行任何内容时必须小心。

与任何访问其控制范围之外内容的应用程序一样,QML应用程序应对其加载的任何不受信任的数据进行适当的检查。例如,不要使用import、Loader或 XMLHttpRequest 来加载任何不受信任的代码或内容。