解读QML之二
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中必须预定义一些符号解析的语法。这一部分可以参见命名空间和符号解
解读QML之二的更多相关文章
- 解读QML之一
http://cache.baiducontent.com/c?m=9d78d513d98002b8599dcb201a17a7374408c6347691c4523f8a9c12d522195646 ...
- 解读QML之四
解读QML之四 QML对象属性 每一个QML对象类型都定义了一系列属性.每创建一个该对象类型的实例,该实例的这些属性也自动被创建了.接下来我们讨论几种不同类型的属性. id属性 每一个QML对象类型都 ...
- Alamofire源码解读系列(十二)之请求(Request)
本篇是Alamofire中的请求抽象层的讲解 前言 在Alamofire中,围绕着Request,设计了很多额外的特性,这也恰恰表明,Request是所有请求的基础部分和发起点.这无疑给我们一个Req ...
- Alamofire源码解读系列(十二)之时间轴(Timeline)
本篇带来Alamofire中关于Timeline的一些思路 前言 Timeline翻译后的意思是时间轴,可以表示一个事件从开始到结束的时间节点.时间轴的概念能够应用在很多地方,比如说微博的主页就是一个 ...
- QML学习(二)——<QML语法>
一.Qml类型 QML类型分为三类:基本类型.QML对象类型以及JavaScript类型 1 基本类型 我们可以再qt帮助文档中搜索基本类型查看 基本类型的概念是相对于QML对象类型而言的,QML 对 ...
- 【Away3D代码解读】(二):渲染核心流程(简介、实体对象收集)
我之前解析过Starling的核心渲染流程,相比Away3D而言Starling真的是足够简单,不过幸运的是两者的渲染流程是大体上相似的:Starling的渲染是每帧调用Starling类中的rend ...
- 解读QML之三
QML语法 1.QML基本语法 1.1导入声明 导入声明允许客户端告诉QML引擎可以在QML文档中使用哪些模块,JavaScript资源以及组件目录.文档中可以使用的类型依赖于在文档中导入的模块.资源 ...
- 详细解读Volley(二)—— ImageRequest & Request简介
上篇文章我们讲到了如何用volley进行简单的网络请求,我们可以很容易的接受到string.JsonObjec类型的返回结果,之前的例子仅仅是一次请求,这里需要说明volley本身就是适合高并发的,所 ...
- 详细解读XMLHttpRequest(二)响应属性、二进制数据、监测上传下载进度
本文主要参考:MDN 分析并操作 responseXML属性 如果你使用 XMLHttpRequest 来获得一个远程的 XML 文档的内容,responseXML 属性将会是一个由 XML 文档解析 ...
随机推荐
- VBS基础篇 - 对象(3) - FileSystemObject对象
VBS基础篇 - 对象(3) - FileSystemObject对象 文件系统是所有操作系统最重要的部分之一,脚本经常会需要对文件及文件夹进行访问和管理,在Vbs中对桌面和文件系统进行访问的顶级 ...
- hdu_5707_Combine String("巴卡斯杯" 中国大学生程序设计竞赛 - 女生专场)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5707 题意:给你三个字符串 a,b,c,问你 c能否拆成a,b,a,b串的每一个字符在c中不能变 题解 ...
- Android Studio的使用(十四)--如何查看资源或者函数在哪些类中被引用
1.我们都知道在Eclipse中可以通过快捷键Ctrl+Shift+G开快速搜索方法.类.资源都在那个类中被使用了. 2.在Android Studio中则使用快捷键Ctrl+G.
- javascript模糊查询一个数组
/* * 模糊查询一个数组 */ com.ty.repairtech.JsonOperation.searchList = function(str, container) { var newList ...
- 被非技术瓶颈阻挡了,没钱买Mac,挣扎ing
最近一直没来写博客,因为一直在找刷盘子.服务生.看店的工. 已经找到,主要因为前阵子天不热,所以酒馆的顾客不多.现在好了. 只好买个Mac mini,看了很多帖子,也只好暂时折中这样了.Mac买不起. ...
- wamp本地能访问,但局域网不能访问的解决办法
Apache的配置文件.
- js调用函数的格式
如题 onclick='alert(\""+""+"\")' onclick='alert(encodeURIComponen ...
- git 创建分支,删除分支,管理分支
参考 http://blog.csdn.net/dijason/article/details/9042425 查看分支: 1 查看本地分支: $ git branch 2 查看远程分支 $ g ...
- 编译 wl18xx驱动源码
在做beagleboneblack移植的时候,wl18xx的驱动源码是自动编译的.但是移植到其他平台优越平台不一样,所以就不能自动编译 所以用其他方式编译.http://e2e.ti.com/supp ...
- Python 线程,进程
Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元 线程不能实现多并发 只能实现伪并发 每次工作 只能是一个线程完成 由于python解释器 原生是c 原生线程 底层都会有一把 ...