http://cache.baiducontent.com/c?m=9d78d513d98002b8599dcb201a17a7374408c6347691c4523f8a9c12d52219564615fea6777c4d51c4c50b3640f9154bea876a25711e71edcc94d61781ee912828822529235cc01a438d4eb29d1163927bce1bf4a51eecbef13493&p=8d65c715d9c041aa01be9b7c1c57cd&newp=aa6fc816d9c15bb34bbd9b7d0d13cb231610db2151d7d0176b82c825d7331b001c3bbfb42323110fd0c37d6001a94f5eeff23170370523a3dda5c91d9fb4c57479923b27&user=baidu&fm=sc&query=QQmlContext&qid=a80e2de00003cea3&p1=2
解读QML之一
Qt QML模块提供了用于实现QML框架的C++类。客户端可以使用这些类与QML运行时交互(例如:数据注入或调用对象的方法),并从QML文件实例化一个对象的层次结构。Qt QML模块提供了许多的C++类,而并非仅仅是列在下面的类。然而列在下面的
类提供了QML运行时的基础和QML的核心概念。
QML运行时
一个典型的QML应用程序有一个C++函数的入口点,该入口点是:实例化一个QQmlEngine并且使用QQmlComponent加载一个QML文档。引擎(QQmlEngine对象)提供了一个默认的QQmlContext,这是一个*的上下文,用于执行定义在QML文档中的方法和表达式。定义在QML文档中的对象层次将会通过调用QQmlComponent实例化对象的create()方法被实例化。
客户端可能需要通过注入属性或者对象到上下文中修改引擎提供的默认QQmlContext。它们可以通过调用QQmlEngine::rootContext()方法来访问*的上下文。
在实例化对象之后,客户端通常就将控制权传递给应用程序的事件循环,以使得用户输入时间(例如鼠标点击)可以被应用程序分发和处理。
注意:Qt Quick模块提供了一个便利的类:QQuickView,该类提供了QML运行时,以及用于显示QML应用的可视化窗口。
QQmlEngine类
QQmlEngine类提供了一个可以用于管理定义在QML文档中对象集成层次的引擎。它提供了一个根QML上下文,表达式可以在该上下文中执行,并且可以确保在需要的时候可以正确的更新对象的属性。
QQmlEngine允许一个全局的配置应用到被它管理的所有的对象上。例如:QNetworkAccessManager用于网络通信,文件路径用于持久性的存储。
可以查看QQmlEngine类文档获取更多信息,并且了解到它如何被应用到应用程序中。
QQmlContext类
QQmlContext类为对象的实例化以及表达式的评估提供了一个上下文环境。所有的对象都在一个特定的上下文中实例化,并且应用程序运行中要执行的表达式都在一个特定的上下文中执行。这个上下文定义了符号是如何被解析的,以及表达式操作的值。
查看QQmlContext类文档获取更多的信息,以及如何获取一个对象的上下文。
动态对象实例化以及表达式的执行
动态对象的实例化以及动态表达式的计算都是QML的核心概念。QML文档定义了可以在运行时通过QQmlComponent实例化的对象类型。一个QQmlComponent类的实例可以通过C++直接创建,或者是通过Qt.createComponent()方法在QML代码中创建。属性表达式可以在C++中通过QQmlExpression类计算,并且这些表达式可以直接在QML上下文中使用。
QQmlComponent类
QQmlComponent类可以用来加载QML文档。它需要QQmlEngine来实例化定义在QML文档中的对象层次。
查看QQmlComponent获取更多的信息,以及如何使用QQmlComponent。
QQmlExpression类
QQmlExpress类为客户端提供了一种在C++中执行JavaScript表达式的方式,使用特定了QML计算上下文。这使得客户端可以通过id访问QML对象。返回的计算结果的类型是QVariant,并且转换原则定义在QML引擎中。
查看QQmlExpression类文档获取更多的信息,以及如何在应用程序中使用QQmlExpression。
QML的类型系统
在QML文档中用于定义对象层次的类型无非来源于以下几种:
*通过QML语言原生提供
*使用QML模块通过C++注册
*QML模块提供的QML文档
当然,应用程序开发者也可以提供他们自己的类型:可以直接通过C++类型注册,也可以在QML文档中定义可重用的组件,然后导入。
无论类型的定义来自哪里,引擎都要求这些类型对属性和实例都是类型安全的。
基本类型
QML语言有一些内建的原语类型,包括整型,双精度浮点型,字符串类型以及布尔类型等。对象可以拥有这些类型的属性,并且这些类型的值可以作为参数传递给对象的方法。
查看QML基本类型文档获取更多信息。
QML支持一系列的基本类型。一个基本类型通常指的是一个简单的值,例如一个int或者一个string。和QML对象类型做对比,QML对象类型通常指的是一个包含属性,信号和方法的对象。不同于对象类型,基本类型不能声明QML对象:例如,不能声明一个int{}对象或者一个size{}对象。
基本类型通常这么使用:
*单个的值(例如:int指一个单个数字,var指条目列表)
*一个包含了一系列属性-值对的值(例如:size值包含了width和height属性的值)
一些基本类型是引擎默认支持的,使用它们不需要导入声明,然而其它的基本类型则需要导入模块后才能使用。所有罗列在下面的类型都可以在QML文档中作为属性使用,除了:
*list必须和一个QML对象一起使用
*enumeration不能被直接使用,除非枚举类型被一个注册的QML对象类型定义
QML语言提供的基本类型
QML模块提供的基本类型
QML模块扩展QML语言提供更多的基本类型。例如:QtQuick模块提供的基本类型罗列如下:
目前,只有Qt提供的QML模块可以提供基本类型,但是这种局面在将来发布的QtQML可能会被改变:我们可以使用一个特定的QML模块提供的类型,客户端只需要早QML文档中导入该模块。
一些基本的类型也拥有属性,例如:font类型就具有pixelSize,family和b属性。与对象类型的属性不同的是,基本类型的属性不提供它们自己属性改变的信号。因此,仅仅只能为基本类型的属性创建属性改变信号的处理者。
基本类型的任一属性改变,那么属性改变的信号就会被发射,例如:
JavaScript类型
JavaScript对象和数组都被QML引擎支持。任何标准的JavaScript类型都可以使用通用的var类型创建和存储。
例如,标准的Date和Array类型都是可使用的:
QML对象类型
QML对象类型就是那些可以实例化的QML对象。QML对象类型都是从QtObject继承而来,并且通过QML模块提供。应用程序可以导入这些模块继而使用这些类型。QtQuick模块提供了大多数在QML中用于创建UI的类型。
每一个QML文档都隐式的定义了一个QML对象类型,它可以在QML文档中重用。
Rectangle就是一个对象类型:它可以被用来创建Rectangle类型的对象。
自定义的QML对象类型可以通过创建一个定义了该对象类型的.qml文件来完成,或者是通过C++定义QML类型并将该类型注册到QML引擎。
通过.qml文件自定义QML类型举例如下:
注:还可以通过Component定义匿名类型,如下:
通过C++定义QML类型举例:略。
解读QML之一的更多相关文章
-
解读QML之四
解读QML之四 QML对象属性 每一个QML对象类型都定义了一系列属性.每创建一个该对象类型的实例,该实例的这些属性也自动被创建了.接下来我们讨论几种不同类型的属性. id属性 每一个QML对象类型都 ...
-
解读QML之三
QML语法 1.QML基本语法 1.1导入声明 导入声明允许客户端告诉QML引擎可以在QML文档中使用哪些模块,JavaScript资源以及组件目录.文档中可以使用的类型依赖于在文档中导入的模块.资源 ...
-
解读QML之二
QML文档 QML文档是用QML语法组成的字符串.一个文档定义了一个QML对象类型.文档以”.qml”最为后缀,可以保存在本地和网络上,可以使用代码生成.一 个在文档中定义的对象类型的实例,也可以使用 ...
-
Qt QML referenceexamples attached Demo hacking
/********************************************************************************************* * Qt ...
-
深度解析qml引擎---(1)Qml文件加载
"美的事物是永恒的喜悦" --- 济慈 ...
-
Qt widget中使用QML自定义电池
1.效果 2.QML 在资源里新建Mybattery.qml: import QtQuick 2.0 import QtQuick 2.12 Item { id: root property colo ...
-
SDWebImage源码解读之SDWebImageDownloaderOperation
第七篇 前言 本篇文章主要讲解下载操作的相关知识,SDWebImageDownloaderOperation的主要任务是把一张图片从服务器下载到内存中.下载数据并不难,如何对下载这一系列的任务进行设计 ...
-
SDWebImage源码解读 之 NSData+ImageContentType
第一篇 前言 从今天开始,我将开启一段源码解读的旅途了.在这里先暂时不透露具体解读的源码到底是哪些?因为也可能随着解读的进行会更改计划.但能够肯定的是,这一系列之中肯定会有Swift版本的代码. 说说 ...
-
SDWebImage源码解读 之 UIImage+GIF
第二篇 前言 本篇是和GIF相关的一个UIImage的分类.主要提供了三个方法: + (UIImage *)sd_animatedGIFNamed:(NSString *)name ----- 根据名 ...
随机推荐
-
Photoshop如何实现UI自动切图?
切图严格来说并不是UI设计师的工作, 而是前端工程师的工作,指的是将UI设计师的设计(大部分为photoshop创建的PSD文件)转化为界面(网页或窗体等)所需要资源的过程.切图是衔接UI设计和应用程 ...
-
RESRful API 和 HTTP状态码
一.RESRful API: GET(SELECT):从服务器取出资源(一项或多项). POST(CREATE):在服务器新建一个资源. PUT(UPDATE):在服务器更新资源(客户端提供改变后的完 ...
-
Android动态布局,并动态为TextView控件设置drawableLeft、drawableRight等属性加入图标
注:(图中每个条目和图标都是由代码动态生成) 代码动态布局,并须要为每个条目设置图标,此时用到了 android:drawableLeft="@drawable/icon" 父x ...
-
01_Python入门
Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程 ...
-
JAVA—枚举(Enum)学习总结
1.枚举(Enumeration) 枚举(The Enumeration)接口定义了一种从数据结构中取回连续元素的方式.这种传统接口已被迭代器取代,虽然Enumeration 还未被遗弃,但在现代代码 ...
-
Ubuntu16.04 启动纯文本界面方法
问题: Ubuntu16.04 如何启动纯文本界面. 解决方法: 1.系统启动后,在登陆界面点击Ctrl+Shift+F1切换到文本登陆界面: 2.修改为默认从文本界面登陆: sudo vi /etc ...
-
网关协议学习:CGI、FastCGI、WSGI
网关协议学习:CGI.FastCGI.WSGI https://www.biaodianfu.com/cgi-fastcgi-wsgi.html
-
junit mockito
package com.zendaimoney.util; import static org.mockito.Mockito.*;import static org.junit.Assert.*;i ...
-
idea+maven无法自动加载jar包
没有配置maven的环境变量所致 执行mvn -version进行检测
-
《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #18 向ext4转换
HACK #18 向ext4转换 ext4可以与ext2/ext3在后台进行互换.这里将介绍从ext2/ext3转换的方法以及转换时的注意事项.转换有两种方法可以将ext2/ext3的磁盘映像作为ex ...