QML文档
QML文档是用QML语法组成的字符串。一个文档定义了一个QML对象类型。文档以”.qml”最为后缀,可以保存在本地和网络上,可以使用代码生成。一 个在文档中定义的对象类型的实例,也可以使用Component在QML代码中创建,或者是在C++中使用QQmlComponent创建。一旦某一个对 象类型明确的在QML对象系统中使用特定的名称注册了,那么该类型就可以在其它的文档中
直接用来声明对象了。在文档中定义可重用的QML对象类型对于允许客户端编写模块来说是十分重要的,也是的代码高度可读和
更加可维护。
QML文档的结构
QML文档由两个部分组成:导入部分,对象声明部分。文档中的导入部分包含了导入描述,定义了文档中可使用的QML对象
类型和JavaScript资源。对象声明部分定义了对象树,当实例化定义在文档中的对象类型的时候,对象树就会被创建。
一个简单的文档示例如下:
在导入部分和对象声明部分之间用一个空行隔开。QML文档通常使用UTF-8编码。
导入
一个文档必须导入必要的模块或者是对象命名空间来确保引擎可以加载文档中声明的QML对象类型。默认情况下,QML文档
可以访问同目录下的.qml文件定义的任何QML对象类型。如果一个文档需要访问其他的对象类型,那么它必须导入该对象的命名空间。
不像C或者C++,在QML引擎加载文档之前,QML没有使用预处理器对文档做任何预处理。Import声明不会拷贝并呈现其代码在文档内,而是指示
QML如何解析这些对象类型。任何出现在QML文档中的类型——包括Rectangle和ListView——构成一个JavaScript块或者是属性
绑定,都是基于导入声明来解析的。至少有一个import声明是需要的:import QtQuick2.0.
根对象声明
一个QML文档描述了一个可以被实例化的对象层次。每一个对象定义都包含一定的结构:对象有一个类型,有一个id,并且有一个对象名,它也可以包含属性,包含方法、信号以及信号处理句柄。
一个QML文档必须只能包含一个单一的根对象定义。下面的文档就是非法的,将会产生错误:
这是因为一个.qml文件自动定义了一个QML类型,该类型封装了单个QML对象的定义。
QML语言的语法
对象声明部分必须使用合适的QML语法指定合法的对象。一个对象的声明可能包含自定义对象属性地热指定。对象方法属性的指定可以类似于JavaScript方法,对象属性可以使用属性绑定表达式指定。
可以查看QML语法获取更多信息,也可以查看集成QML和JavaScript获取更多信息。
通过QML文档定义对象类型
在前面我们简单的表述了如何在一个QML文档中定义一个QML对象类型。QML的核心原则是可以定义可重用的对象类型。这提高了QML代码的可维护性,增加了代码层次声明的可读性,提高了UI界面定义和逻辑实现的分离性。
在下面的例子中,客户端开发者在文档中定义了人Button类型:
Button类型可以在应用程序中如下使用:
资源加载和网络传输
QML是网络可传输的。应用程序可以像导入本地路径那样导入远端路径上的文档。实际上任何url属性都可以被指定为本地或者是远端的URL,并且QML引擎会自动处理任何与网络通信相关的内容。
QML通过使用URLs(而不是文件名)来获取QML文档中引用的内容以支持网络传输。这意味着任何URL资源都是可以的,QML可以像处理本地资源那样处理远端资源。例如:
因为相对的URL跟相对的文件是相同的可以使用如下简单表达式代替上面的:
在整个QML中,网络传输都是被支持的,例如:
*Fonts——FontLoader的source属性是一个URL;
*WebViews——WebView的url属性;
甚至是QML类型本身也是在网络上的——如果qmlscence被用来加载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,那么QML不会做任何处理,直接使用,如果使用的是相对的URL,那么QML会转换为绝对URL再使用。
QRC资源
URL语法的表达式在Qt中内建为”qrc”语法。这允许应用程序使用Qt资源系统将这些内容编译到可执行文件中。使用QRC资源,可以将QML文档编译到可执行程序中。
这个时候可以使用相对URL,这个时候也不需要传输,因为qml内容直接编译到可执行程序中。
限制
只有在import声明中使用了”as”表达式才会引起网络传输。
更多细节:
*import “dir” 只在本地文件系统起作用
*importlibraryUri 只在本地文件系统起作用
*import “dir” asD 可以在网络传输中使用
*importlibraryuri as U 可以在网络传输中使用
应用程序安全的意义
QML安全模型就是QML内容是可信赖的:用户安装QML内容就像他们安装原生Qt应用程序,或者是那些使用运行时编写的程序例如Python和Perl。这个信任是建立在一系列的机制之上,包括在某些平台上使用的包的签名机制。
为了保存用户的信任,QML应用程序开发者不能加载和执行任意的JavaScript或者QML资源。例如:下面的QML代码:
这等同于下载并且执行http://evil.com/evil.exe。QML引擎将不会阻止特定的资源下载。不像JavaScript代码在浏览器中执行,QML应用程序可以像其它应用程序一样以同样的方式加载本地和远端的资源。因此应用程序开发者必须足够的小心加载和执行任
何内容。对于应用程序访问超出其控制权的内容,QML必须对它加载的数据加以校验。例如,不要使用import,Loader或者XMLHttpRequest来加载任何不可靠的代码或内容。
命名空间和名称解析
文档中的表达式大部分是调用对象或者是对象的属性,由于可能会定义多个对象并且不同的对象的不同属性有着相同的名字,QML中必须预定义一些符号解析的语法。这一部分可以参见命名空间和符号解