QML值类型
QML支持内置和自定义值类型。
值类型 是一种概念上通过值传递而不是通过引用传递的类型,例如 int
或 string
。这与 QML对象类型 形成对比。对象类型是通过引用传递的。如果你将一个对象类型的实例赋给两个不同的属性,两个属性都携带相同的值。修改对象将在两个属性中反映出来。如果你将一个值类型的实例赋给两个不同的属性,这些属性携带不同的值。如果你修改其中之一,另一个保持不变。由于必须能够将它们作为JavaScript对象进行交互,因此值类型仅在概念上通过值传递。为了便于这一点,在实际中,当你从JavaScript代码中访问它们时,它们作为 值类型引用 传递。
与对象类型不同,值类型不能用于声明QML对象:例如,无法声明一个 int{}
对象或一个 size{}
对象。
值类型可用于引用
当变量或属性包含值类型并且将其赋给另一个变量或属性时,则会制作值的副本。
可用的值类型
一些值类型由引擎默认支持,并且在使用时不需要导入语句,而其他值类型则需要客户端导入提供它们的模块。以下列出的所有值类型均可用作QML文档中的 属性
类型,以下列异常除外
void
,它表示值的缺失- 必须与对象或值类型一起使用
list
作为元素 - 不能直接使用
enumeration
,因为枚举必须由已注册的QML对象类型定义
QML语言提供的内置值类型
以下列出的是在QML语言中本机支持的内置值类型
二进制真/假值 | |
日期值 | |
带有小数点的数字,以双精度存储 | |
命名枚举值 | |
整数,例如 0、10 或 -20 | |
QML对象列表 | |
带有小数点的数字 | |
自由形式的文本字符串 | |
资源定位器 | |
泛型属性类型 | |
泛型属性类型 | |
空值类型 |
QML模块提供的值类型
QML模块可以扩展QML语言以包含更多的值类型。
例如,由QtQml模块提供的值类型包括
由QtQuick模块提供的值类型包括
ARGB颜色值 | |
具有QFont属性的字体值。字体类型指的是具有QFont属性的字体值 | |
matrix4x4类型是一个4行4列的矩阵 | |
四元数类型具有标量、x、y和z属性 | |
vector2d类型具有x和y属性 | |
有x、y和z属性的值 | |
vector4d类型具有x、y、z和w属性 |
Qt全局对象为有用的函数提供了操作Qt Qml和Qt Quick模块的值类型的值。
其他Qt模块将在各自的模块页面上记录它们的值类型。
您可以像在从C++定义QML类型中描述的那样定义自己的值类型。为了使用特定QML模块提供的类型,客户端必须在他们的QML文档中导入该模块。
值类型的属性更改行为
一些值类型具有属性:例如,font类型具有pixelSize
、family
和bold
属性。与对象类型的属性不同,值类型的属性不提供自己的属性更改信号。只能为值类型的属性本身创建属性更改信号处理程序
Text { // invalid! onFont.pixelSizeChanged: doSomething() // also invalid! font { onPixelSizeChanged: doSomething() } // but this is ok onFontChanged: doSomething() }
然而,请注意,值类型的属性更改信号会在其任何属性更改时以及属性本身更改时发出。以下代码为例
Text { onFontChanged: console.log("font changed") Text { id: otherText } focus: true // changing any of the font attributes, or reassigning the property // to a different font value, will invoke the onFontChanged handler Keys.onDigit1Pressed: font.pixelSize += 1 Keys.onDigit2Pressed: font.b = !font.b Keys.onDigit3Pressed: font = otherText.font }
相比之下,对象类型的属性会发出它们自己的属性更改信号,并且只有在将对象类型的属性重新分配给不同的对象值时,才会调用对象类型属性的属性更改信号处理程序。
另请参阅QML类型系统。
© 2024 Qt公司。本文档中包含的文档贡献是相应所有者的版权。本提供的文档是根据由自由软件基金会发布的GNU自由文档许可证版本1.3的条款许可的。Qt和相应的标志是芬兰的Qt公司或世界其他国家的