解读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中必须预定义一些符号解析的语法。这一部分可以参见命名空间和符号解

时间: 2024-11-13 10:07:45

解读QML之二的相关文章

解读QML之一

http://blog.csdn.net/chenlong12580/article/details/8596342 解读QML之一 Qt QML模块提供了用于实现QML框架的C++类.客户端可以使用这些类与QML运行时交互(例如:数据注入或调用对象的方法),并从QML文件实例化一个 对象的层次结构.Qt QML模块提供了许多的C++类,而并非仅仅是列在下面的类.然而列在下面的 类提供了QML运行时的基础和QML的核心概念. QML运行时 一个典型的QML应用程序有一个C++函数的入口点,该入口

解读QML之四

解读QML之四 QML对象属性 每一个QML对象类型都定义了一系列属性.每创建一个该对象类型的实例,该实例的这些属性也自动被创建了.接下来我们讨论几种不同类型的属性. id属性 每一个QML对象类型都有一个唯一确定的id属性.这个属性是由QML语言自身提供的,并且在QML对象类型中不能被重定义和重载. 我们必须为id属性指定一个值允许该对象被唯一标示并且可用于被其它对象引用.Id属性值必须以小写字母或者下划线开始,只能包含字母,数字和下划线等字符. 下面是一个TextInput对象和一个Text

详细解读Volley(二)—— ImageRequest & Request简介

上篇文章我们讲到了如何用volley进行简单的网络请求,我们可以很容易的接受到string.JsonObjec类型的返回结果,之前的例子仅仅是一次请求,这里需要说明volley本身就是适合高并发的,所以它可以运行你用volley在短时间内进行多次请求,并且不用去手动管理线程数.仅仅是请求文字过于基础了,本篇将讲述如何用volley从网络下载图片. 一.用ImageRequest来请求图片 ImageRequest是一个图片请求对象,它继承自Request<Bitmap>,所以请求得到的结果是一

【Away3D代码解读】(二):渲染核心流程(简介、实体对象收集)

我之前解析过Starling的核心渲染流程,相比Away3D而言Starling真的是足够简单,不过幸运的是两者的渲染流程是大体上相似的:Starling的渲染是每帧调用Starling类中的render方法,类似的Away3D的渲染是每帧调用View3D类中的render方法,那我们要了解Away3D的渲染就需要从这个方法入手了. View3D的render方法源码: 1 /** 2 * Renders the view. 3 */ 4 public function render():voi

江边望海解读敏捷十二原则

1.前言 敏捷确实是一个好东西.特别是对于那些正在经受着需求变更.人员变动.BUG修改不彻底的团队来说是非常管用的.在产品开发的时候,刚才的那些问题只是冰山一角.团队还面临着开发人员工作量统计,代码编写随意,需求变更频繁,产品经理当测试经理的诸多问题.一句话:队伍大了管理成本是在直线上升的.那么,如何才能解决看似『团队执行力问题』其实是『管理问题』的呢?江边望海将结合着这么多年的IT产品开发经验来分析一下如何使用『敏捷』打造一个高效的开发团队. 为什么要敏捷 为什么敏捷推不下去? 没有技术实力你

解读QML之三

QML语法 1.QML基本语法 1.1导入声明 导入声明允许客户端告诉QML引擎可以在QML文档中使用哪些模块,JavaScript资源以及组件目录.文档中可以使用的类型依赖于在文档中导入的模块.资源以及目录. 导入类型 总共有三种类型的导入.对于每一种导入类型在语法上都有细微的差别,并且不同的导入类型有着不同的语义. *模块(命名空间)的导入 最常用的导入类型就是模块导入.客户端可以导入那些已经注册QML对象类型和JavaScript资源到给定命名空间的QML模块. 导入模块最通用的格式如下:

.net之qrcode二维码(一)——基础知识

1.二维码定义: 二维码(2-Dimensional Bar Code),是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的.它是指在一维条码的基础上扩展出另一维具有可读性的条码,使用黑白矩形图案表示二进制数据,被设备扫描后可获取其中所包含的信息.一维条码的宽度记载着数据,而其长度没有记载数据.二维条码的长度.宽度均记载着数据.二维条码有一维条码没有的"定位点"和"容错机制".容错机制在即使没有辨识到全部的条码.或是说条码有污

『脉脉体验』

今天无意间在手机应用商店中发现了一块app『脉脉』 我认为脉脉最大的亮点,是在你注册之初就已经有了很多可供使用的数据内容.甚至有点“吓一跳”的感觉,所有隐藏的人际关系都被拎出来了,一上来就能看到. 脉脉是淘友旗下的第4款产品,于2013年10月底上线.这是一款基于移动端的人脉社交应用,通过分析用户的通讯录数据,帮助用户发现新的朋友,并且可以使他们建立联系.上面累计了400亿条人脉关系,2亿张个人名片,80万职场圈子.应用提供了职场动态分享.人脉管理.人脉招聘.匿名职场八卦等功能,致力于帮助职场用

王家林 大数据Spark超经典视频链接全集[转]

压缩过的大数据Spark蘑菇云行动前置课程视频百度云分享链接 链接:http://pan.baidu.com/s/1cFqjQu SCALA专辑 Scala深入浅出经典视频 链接:http://pan.baidu.com/s/1i4Gh3Xb 密码:25jc DT大数据梦工厂大数据spark蘑菇云Scala语言全集(持续更新中) http://www.tudou.com/plcover/rd3LTMjBpZA/ 1 Spark视频王家林第1课:大数据时代的“黄金”语言Scala 2 Spark视