//MainForm.qml
import QtQuick 2.7 //导入Qt Quick 2.7库
Rectangle { //根对象: Rectangle
property alias mouseArea: mouseArea //属性别名
property alias textEdit: textEdit
width: 360 //属性(宽度)
height: 360 //属性(高度)
MouseArea { //子对象1: MouseArea
id: mouseArea //对象标识符
anchors.fill: parent
}
TextEdit { //子对象2: TextEdit
id: textEdit
text: qsTr("Enter some text...")
verticalAlignment: Text.AlignVCenter
anchors.top: parent.top
anchors.horizontalCenter: parent.horizontalCenter
anchors.topMargin: 20
Rectangle { //子对象2的子对象: Rectangle
anchors.fill: parent
anchors.margins: -10
color: "transparent"
border.width: 1
}
}
}
1、对象和属性
每个QML文档有且只有一个根对象,在上述代码汇总就是一个Rectangle(矩形)对象。对象可以嵌套,即一个QML对象可以没有、可以有一个或多个子对象,例如在上述代码中,Rectangle有两个子对象:MouseArea和TextEdit,而子对象TextEdit本身又拥有一个子对象Rectangle。
对象由他们的类型指定,以大写字母开头,后面跟一对大括号
{}
,
{}
之中是该对象的属性,属性以键值对
属性名: 值
的形式给出,例如:
Rectangle {
...
width: 360
height: 360
...
}
定义了一个宽度和高度都是360像素的矩形。QML允许将多个属性写在一行,但它们之间必须用分号隔开,所以以上代码也可以写为:
Rectangle {
...
width: 360; height: 360
...
}
对象
MouseArea
是可以响应鼠标事件的区域,作为子对象,它可以使用parent关键字访问其父对象。其属性
anchors.fill
起到布局作用,它会使
MouseArea
充满一个对象的内部,这里设值为
parent
表示
MouseArea
充满整个矩形,即整个窗口内部都是鼠标响应区。
TextEdit
是一个文本编辑对象,属性text是其默认要输出显示的文本(Enter some text…),属性
anchors.top
、
anchors.horizontalCenter
和
anchors.topMargin
都是布局用的,这里设为使
TextEdit
处于矩形窗口的上部水平居中的位置,矩窗口顶部有20像素的边距。
本段代码开头的import语句导入了QtQuick模块(默认是Qt Quick2.7库),它包含所有的标准QML对象。如果没有这条语句,则无法使用根对象、两个子对象以及子对象的子对象。
QML文档中的各种对象及其子对象以这种层次结构组织在一起,共同描述一个可显示的用户界面。
2、对象标识符
每个对象都可以指定一个唯一的id值,这样便可以在其他对象中识别并引用该对象,例如:
MouseArea {
...
id: mouseArea
...
}
就给MouseArea指定了id为mouseArea。可以在一个对象所在的QML文档中的任何地方,通过使用该对象的id来引用该对象。因此,id值在一个QML文档中必须是唯一的。对于一个QML对象而言,id值是一个特殊的值,不要把它看成一个普通的属性,例如,无法使用
mouseArea.id
来进行访问。一旦一个对象被创建,它的id就无法被改变了。
注意
:id值必须使用小写字母或以下划线开头,并且不能使用除字母、数组和下划线外的字符。
3、属性别名
属性也可以有别名,QML使用
alias
关键字声明属性的别名:
property alias 别名: 属性名
,例如:
Rectangle {
property alias mouseArea: mouseArea
property alias textEdit: textEdit
...
MouseArea {
id: mouseArea
...
}
TextEdit {
id: textEdit
...
}
}
这里把MouseArea看成Rectangle的一个属性(QML中的子对象也可以视为其父对象的属性),取其id(mouseArea)为属性名,并给它定义一个别名“mouseArea”,这样做的目的是为了在外部QML文档(main.qml)中也能访问到MouseArea。因为MouseArea内置了一个onClicked属性,它是一个回调(鼠标点击事件),定义了别名后,就可以在main.qml代码中访问这个属性:
mouseArea.onclicked: {
console.log(qsTr('Clicked on background. Text: "' + textEdit.text + '"'))
}
当单击事件发出时,就会执行onClicked中的代码,在开发环境底部的“应用程序输出”子窗口中输出文本:“qml: Clicked on background. Text: “Hello World!””。同理,TextEdit也可以看成Rectangle的一个属性,并为其定义别名和引用。
由此可见,属性别名对于允许外部对象直接修改和访问另一个QML文档中的子对象很有用。
4、注释
QML文档的注释同C/C++、JavaScript代码的注释一样:
(1)单行注释使用
//
开始,在行的末尾结束。
(2)多行注释使用
/*
开始,使用
*/
结尾。