在 QML 语言中,变量和属性是非常重要的内容。有了它们,QML 才能不仅仅是一个界面描述语言,还可以处理各种业务逻辑。在 QML 中有两个概念:变量和属性。虽然它们有区别,但在这里我们统一将它们视为变量,只要有一个标识符去存储某种类型的内容,我们就可以称之为变量。
在 QML 中,“特性(attributes)”和“属性(property)”是两个关键概念,尽管它们有些相似,但在具体用途和使用方法上存在一些差异。
特性是某些 QML 元件(如 Item
、Rectangle
、Text
等)内建的预定义属性,通常与这些元件的显示或布局特性直接相关。特性在 QML 对象的声明中自动提供,无需显式定义。例如:
Rectangle {
width: 100
height: 100
color: "red"
}
在上面的例子中,width
、height
和 color
是 Rectangle
组件的内建特性,它们用于设置这个矩形的宽度、高度和颜色。这些特性是由组件本身定义和支持的。
特性通常具有以下特点:
属性是开发者在 QML 文件中自定义的变量,用于存储数据并控制组件的状态或行为。属性的定义允许更灵活的数据存储和操作,可以根据需求创建不同类型的属性。定义属性的关键字是 property
,它可以用于各种类型的数据,如整数、字符串、布尔值、颜色等。例如:
Rectangle {
property int myWidth: 100
property string myText: "Hello, QML!"
width: myWidth
height: myWidth
Text {
text: myText
anchors.centerIn: parent
}
}
在这个例子中:
myWidth
和 myText
是自定义的属性。属性通常具有以下特点:
default
、required
和 readonly
,以控制属性的行为。这两者的区别主要在于用途上的不同,特性通常用于调整组件的标准特征,而属性则是开发者为组件自定义的数据和状态控制方式。
我们主要介绍变量的几种定义方式,包括基础类型的定义和赋值。
每个 QML 类型都可以有一个 ID,用于标识该对象。例如:
Item {
id: uiRoot
width: 200
height: 200
}
uiRoot
是该对象的 ID,用于在代码中访问它的属性和方法。
可以通过 property
关键字来定义用户自定义属性:
Item {
property int index: 100
}
以上代码定义了一个名为 index
的整型属性,初始值为 100
。在赋初始值时,使用冒号而不是等号。
QML 中的属性可以通过直接赋值、表达式或函数调用进行初始化。赋值时的表达式支持与其他变量之间的动态关联,因此当被关联的变量变化时,当前属性也会自动更新。
可以通过以下方式访问变量:
Item {
id: parentItem
property int parentWidth: width
Rectangle {
id: childRect
width: parentItem.width / 2
height: parentItem.height / 2
}
}
在不同的作用域内,通过父节点的 ID
可以访问父节点的属性值。可以使用 parent
关键字来访问父节点的属性,例如访问父节点的宽度 parent.width
。
以下是一个带有按钮的示例,点击按钮时修改变量的值:
Item {
width: 300
height: 300
property int count: 100
Button {
id: myButton
text: "Click Me"
anchors.centerIn: parent
onClicked: {
count += 10;
console.log("New count: " + count);
}
}
}
当用户点击按钮时,count
的值增加 10,并在控制台中打印出新值。
可以使用 default
来定义一个默认属性。例如:
default property alias content: children
default
表示该属性是该类型的默认属性。
可以使用 required
关键字来指定某个属性必须被赋值,否则编译器会报错。例如:
property int required age
使用 readonly
可以定义只读属性。例如:
readonly property string version: "1.0.0"
只读属性只能在初始化时赋值,后续无法修改。
alias
用于定义属性的别名,以简化对已有属性的访问。例如:
Item {
property alias aliasWidth: rect.width
Rectangle {
id: rect
width: 100
height: 100
}
}
通过 aliasWidth
可以访问 rect
的 width
属性。
property
定义,支持赋值、表达式和函数调用。通过对 QML 变量和属性的理解,可以更好地管理和控制 QML 中界面元素的行为和交互逻辑。