资源加载和网络透明度#

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

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.qmlHello.qml 引用的任何其他资源,通常通过相对URL,也将类似地从网络中加载。

相对URL与绝对URL#

每当一个对象具有类型为URL(QUrl)的属性时,将该字符串分配给该属性实际上是将一个绝对URL分配给它 - 通过将该字符串与字符串使用的文档的URL解析。

例如,考虑下面的在 http://example.com/mystuff/test.qml 中的内容

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 内容是一个受信任内容的链:用户像安装本地的 Qt 应用程序或使用 Python 和 Perl 等运行时编写的程序那样信任他们安装的 QML 内容。这种信任是通过多种机制建立的,包括某些平台上的软件包签名可用性。

为了保留用户的信任,不应对 QML 应用程序加载和执行任意 JavaScript 或 QML 资源。例如,考虑以下 QML 代码:

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

与任何访问其控制之外的其他内容的任何应用程序一样,一个 QML 应用程序应该对其加载的任何不可信数据进行适当的检查。 例如,不要使用 XMLHttpRequest 加载任何不可信的代码或内容。