QML参考指南02:QML对象属性一

每个QML对象类型都有一组定义的属性。使用为该对象类型定义的属性集创建对象类型的每个实例。可以指定几种不同的属性,如下所述。

对象声明中的属性

QML文档中的对象声明定义了一种新类型。它还声明了一个对象层次结构,如果创建该新定义类型的实例,则将实例化该对象层次结构。

QML对象类型属性类型的集合如下:

· ID属性

· property属性

· 信号属性

· 信号处理程序属性

· 方法属性

· 附加属性和附加信号处理程序属性

· 枚举属性

这些属性将在下面详细讨论。

ID属性

每个QML对象类型都有一个唯一的id属性。此属性由语言本身提供,并且不能由任何QML对象类型重新定义或覆盖。

可以将值分配给对象实例的id属性,以允许该对象被其他对象标识和引用。id必须以小写字母或下划线开头,并且不能包含字母,数字和下划线以外的字符。

下面是一个TextInput对象和一个Text对象。该的TextInput对象的id值设置为"myTextInput"。该文本对象设置其text属性就是等同TextInput的text属性,参考myTextInput.text。现在,两个项目将显示相同的文本:

import QtQuick 2.0
Column {
width: 200; height: 200
TextInput { id: myTextInput; text: "Hello World" }
Text { text: myTextInput.text }
}

可以在声明对象id的组件范围内的任何位置引用该对象。因此,id值在其组成范围内必须始终是唯一的。

创建对象实例后,无法更改其id属性的值。尽管它看起来像是普通属性,但该id属性不是普通property属性,并且特殊语义适用于此属性;例如,myTextInput.id在上面的示例中无法访问。

property属性

property是可以分配静态值或绑定到动态表达式的对象的属性。一个property的值可以被其他对象读取。通常,它也可以由另一个对象修改,除非特定的QML类型明确禁止特定property使用。

定义property属性

通过注册类的Q_PROPERTY,然后再向QML类型系统注册,可以在C ++中为类型定义property。或者,可以使用以下语法在QML文档的对象声明中定义对象类型的自定义property:

[ default] property < propertyType > < propertyName >

这样,对象声明可以将特定的值暴露给外部对象,或者更容易维护一些内部状态。

property名称必须以小写字母开头,并且只能包含字母,数字和下划线。JavaScript保留字不是有效的属性名称。该default关键字是可选的,并修改所声明的property的语义。

声明自定义属性会隐式创建该属性的值更改信号,以及一个名为on <PropertyName> Changed的关联信号处理程序,其中<PropertyName>是属性的名称,首字母大写。

例如,以下对象声明定义了一个从Rectangle基本类型派生的新类型。它具有两个新属性,并为这些新属性之一实现了信号处理程序:

Rectangle {
property color previousColor
property color nextColor
onNextColorChanged: console.log("The next color will be: " + nextColor.toString())
}

自定义属性定义中的有效类型

除枚举类型外,任何QML基本类型都可用作自定义属性类型。例如,这些都是有效的属性声明:

Item {
property int someNumber
property string someString
property url someUrl
}

(枚举值只是整数值,可以用int类型来引用。)

QtQuick模块提供了一些基本类型,因此除非导入模块,否则它们不能用作属性类型。

请注意,var基本类型是通用占位符类型,可以保存任何类型的值,包括列表和对象:

property var someNumber: 1.5
property var someString: "abc"
property var someBool: true
property var someList: [1, 2, "three", "four"]
property var someObject: Rectangle { width: 100; height: 100; color: "red" }

此外,任何QML对象类型都可以用作属性类型。例如:

property Item someItem
property Rectangle someRectangle

这也适用于自定义QML类型。如果在名为ColorfulButton.qml(在随后由客户端导入的目录中)文件中定义了QML类型,则type属性ColorfulButton也将有效。

将值分配给property属性

可以通过两种不同的方式指定对象实例的属性的值:

· 初始化时的值分配

· 必要的值分配

无论哪种情况,该值都可以是静态值或绑定表达式值。

初始化时的值分配

在初始化时为属性分配值的语法是:

< propertyName >:<值>

如果需要,可以将初始化值分配与对象声明中的属性定义组合。在这种情况下,属性定义的语法变为:

[ default] property < propertyType > < propertyName >:<值>

属性值初始化的示例如下:

import QtQuick 2.0
Rectangle {
color: "red"
property color nextColor: "blue" // combined property declaration and initialization}

命令性值分配

命令性值分配是将属性值(静态值或绑定表达式)从命令性JavaScript代码分配给属性的地方。强制性值赋值的语法只是JavaScript赋值运算符,如下所示:

[ < objectId > .] < propertyName > =值

强制性值分配的示例如下:

import QtQuick 2.0
Rectangle {
id: rect
Component.onCompleted: {
rect.color = "red"
}}

静态值和绑定表达式值

如前所述,可以为属性分配两种值:静态值和绑定表达式值。后者也称为属性绑定。

这是一个示例,显示了两种分配给属性的值:

import QtQuick 2.0
Rectangle {
// both of these are static value assignments on initialization
width: 400
height: 200

Rectangle {
// both of these are binding expression value assignments on initialization
width: parent.width / 2
height: parent.height
}}

注意:要强制分配绑定表达式,绑定表达式必须包含在传递给Qt.binding()的函数中,然后必须将Qt.binding()返回的值分配给该属性。相反,在初始化时分配绑定表达式时,不得使用Qt.binding()。

类型安全

属性是类型安全的。只能为属性分配与属性类型匹配的值。

例如,如果一个属性是一个实数,并且如果您尝试为其分配一个字符串,则会出现错误:

property int volume:" four" //产生错误;该属性的对象将不会加载

同样,如果在运行时为属性分配了错误类型的值,则不会分配新值,并且会生成错误。

某些属性类型没有自然值表示形式,对于这些属性类型,QML引擎自动执行字符串到类型值的转换。因此,例如,即使color类型的属性存储颜色而不是字符串,您也可以将字符串分配给"red"color属性,而不会报告错误。

有关默认支持的属性类型的列表,请参见QML基本类型。另外,任何可用的QML对象类型也可以用作属性类型。

特殊Property 类型

对象列表Property属性

一个列表类型属性可被分配QML对象类型值的列表。定义对象列表值的语法是用方括号括起来的逗号分隔列表:

[ <item 1>, <item 2>, ... ]

例如,Item类型具有一个states属性,该属性用于保存State类型对象的列表。下面的代码将该属性的值初始化为三个State对象的列表:

import QtQuick 2.0
Item {
states: [
State { name: "loading" },
State { name: "running" },
State { name: "stopped" }
]}

如果列表包含单个项目,则可以省略方括号:

import QtQuick 2.0
Item {
states: State { name: "running" }}

一个列表类型属性可以与下面的语法的对象声明中指定:

[default] property list<<objectType>> propertyName

并且,与其他属性声明一样,可以使用以下语法将属性初始化与属性声明结合使用:

[default] property list<<objectType>> propertyName: <value>

列表属性声明的示例如下:

import QtQuick 2.0
Rectangle {
// declaration without initialization
property list<Rectangle> siblingRects

// declaration with initialization
property list<Rectangle> childRects: [
Rectangle { color: "red" },
Rectangle { color: "blue"}
]}

如果您希望声明一个属性来存储值列表,这些列表不一定是QML对象类型的值,则应该声明一个var属性。

分组属性

在某些情况下,属性包含一组逻辑的子属性属性。可以使用点符号或组符号将这些子属性属性分配给它们。

例如," 文本"类型具有字体组属性。下面,第一个Text对象font使用点表示法初始化其值,而第二个对象使用组表示法:

Text {
//dot notation
font.pixelSize: 12
font.b: true}
Text {
//group notation
font { pixelSize: 12; b: true }}

分组属性类型是具有子属性的基本类型。这些基本类型中的一些是由QML语言提供的,而其他一些仅在导入Qt Quick模块时才可以使用。

发布了52 篇原创文章 · 获赞 4 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/caridle/article/details/105693900
QML
今日推荐