来源:www.qter.org (根据博主自我需求适当删改)
1.导入语句
import...
类似于C++中的 include,在QMl中使用 import 语句导入模块,模块中包含了各种QML类型。QtQuick 模块为创建图形用户界面提供了最基本的类型,比如代码中使用的Text类型就包含在 QtQuick 模块中,QML文档中首先要导入该模块。
因为代码中使用了 Window 类型,所以这里还导入了 QtQuick.Window 模块。Window类型可以为 Qt Quick 场景创建一个顶级窗口,所以它一般作为根对象,在其中可以创建其他QML对象。
2.QML类型
QML的类型系统包含了基本类型、 QML 对象类型和 JavaScript 类型,这些类型组成了整个QML文档。
- 基本类型
在QML中将指向简单数据的类型称为基本类型,比如 int 或 string 等。基本类型的概念是相对于QML对象类型而言的,QML 对象类型可以包含属性、信号和函数等,但基本类型不能作为对象,比如 int {} 是不允许的。QML模块也可以提供基本类型,例如 date、point、rect、size 等。详细内容大家可以在帮助中索引 QML Basic Types
关键字。
- QML对象类型(QML Object Types) (可以包含属性、信号和函数等
QML对象类型就是可以实例化QML对象的类型。从语法上面来说,QML对象类型可以通过类型名称{对象特性}
的格式来定义一个对象。例如,代码中 Window 和 Text 都是对象类型。当对象类型被实例化以后,就被叫做该对象类型的对象 ,例如 Text 对象类型在代码中被实例化为了 Text 类型的对象 Text,之所以这两个概念容易被混淆,是因为它们是同名的。只需要记住对象类型后面添加 {} 后就被称为对象
,大家也可以类比C++中的类与实例化。
如下图,Text对象类型被实例化,成为Text对象。里面包含了属性、函数...
- JavaScript 类型
QML支持JavaScript对象和数组,可以通过var
类型创建并存储任何标准的JavaScript类型。下面是一个例子:
3.对象、属性
QML对象由类型指定,一般与类型同名,名称以大写字母开头,后面跟一对大括号,在括号中包含了对象特性(QML Object Attributes)定义,包括 id、属性、信号、信号处理器、方法、附加属性和附加信号处理器等,当然也可以包含子对象。
属性是对象的特性之一,可以分配一个静态的值或者绑定一个动态表达式,属性和值由一个冒号隔开,使用“属性 : 值”语法进行初始化,比如前面代码中width: 640
。属性可以分行写,这样结尾可以不用分号,也可以写在一行,中间使用分号隔开,例如:width: 640 ; height: 480
。可以在任意对象类型的帮助文档中查看该类型的所有属性。
4.锚布局
anchors 翻译过来就是锚,使用它可以进行简单的布局,当然这只是QML布局中的一种方法,不过很常用。anchors可以在一个部件的上、下、左、右、水平居中、垂直居中、中心等位置进行锚定。
比如Text 对象中 anchors.centerIn: parent
就是将 Text 对象锚定在了其父对象也就是 Window 的中心。
在 Rectangle 对象中,我们使用anchors.left: text1.right
将绿色圆形的左侧与文本的右侧进行锚定,效果就是绿色圆形紧挨文本右侧放置;anchors.leftMargin: 10
表明绿色圆形左侧的边距为10;anchors.verticalCenter: text1.verticalCenter
表明绿色圆形的垂直居中位置锚定到文本的垂直居中位置,效果就是绿色圆形与文本在同一行上,且中心线对其。
5.信号-槽机制
在QML中,信号是发生事件的对象发出的通知,比如MouseArea 对象被点击了,会发射clicked 信号,这时可以在对应的信号处理器( Qt C++ 中叫做槽)中获得通知,信号处理器的格式是 on<Signal> ,其中 <Signal> 是信号的名称(首字母必须大写),所以前面我们一直在 onClicked 中进行点击按钮后的操作。
如果信号有参数,那么参数类型必须声明,如果没有参数,那么可以省略后面的小括号。
发射一个信号,就是调用该信号。当一个信号被发射后,其对应的信号处理器就会被调用,在其中可以直接访问信号的参数。
另外,还可以使用connect()函数将信号与一个方法或者另外的信号进行关联,语法是:对象id.信号.connect (方法或者信号)
在启动时执行操作(Component.onCompleted)
每一个QML对象类型都包含一个附加的 Component 属性,在对象被实例化完成后该属性会发射completed信号,其对应的onCompleted 处理器会在QML环境完全建立以后执行。所以,我们想要在程序启动后执行一些操作,可以放到 Component.onCompleted 中执行。