QML值类型

QML支持内置和自定义值类型。

值类型 是一种概念上通过值传递而不是通过引用传递的类型,例如 intstring。这与 QML对象类型 形成对比。对象类型是通过引用传递的。如果你将一个对象类型的实例赋给两个不同的属性,两个属性都携带相同的值。修改对象将在两个属性中反映出来。如果你将一个值类型的实例赋给两个不同的属性,这些属性携带不同的值。如果你修改其中之一,另一个保持不变。由于必须能够将它们作为JavaScript对象进行交互,因此值类型仅在概念上通过值传递。为了便于这一点,在实际中,当你从JavaScript代码中访问它们时,它们作为 值类型引用 传递。

与对象类型不同,值类型不能用于声明QML对象:例如,无法声明一个 int{} 对象或一个 size{} 对象。

值类型可用于引用

  • 单个值(例如,int 指一个单独的数字)
  • 包含属性和方法的价值(例如,size 指的是具有 widthheight 属性的值)
  • 泛型类型 var。它可以保存任何其他类型的值,但自身是值类型。

当变量或属性包含值类型并且将其赋给另一个变量或属性时,则会制作值的副本。

可用的值类型

一些值类型由引擎默认支持,并且在使用时不需要导入语句,而其他值类型则需要客户端导入提供它们的模块。以下列出的所有值类型均可用作QML文档中的 属性 类型,以下列异常除外

  • void,它表示值的缺失
  • 必须与对象或值类型一起使用 list 作为元素
  • 不能直接使用 enumeration,因为枚举必须由已注册的QML对象类型定义

QML语言提供的内置值类型

以下列出的是在QML语言中本机支持的内置值类型

bool

二进制真/假值

date

日期值

double

带有小数点的数字,以双精度存储

enumeration

命名枚举值

int

整数,例如 0、10 或 -20

list

QML对象列表

real

带有小数点的数字

string

自由形式的文本字符串

url

资源定位器

var

泛型属性类型

variant

泛型属性类型

void

空值类型

QML模块提供的值类型

QML模块可以扩展QML语言以包含更多的值类型。

例如,由QtQml模块提供的值类型包括

point

有x和y属性的值

rect

有x、y、宽度和高度属性的值

size

有宽度和高度属性的值

由QtQuick模块提供的值类型包括

color

ARGB颜色值

font

具有QFont属性的字体值。字体类型指的是具有QFont属性的字体值

matrix4x4

matrix4x4类型是一个4行4列的矩阵

quaternion

四元数类型具有标量、x、y和z属性

vector2d

vector2d类型具有x和y属性

vector3d

有x、y和z属性的值

vector4d

vector4d类型具有x、y、z和w属性

Qt全局对象为有用的函数提供了操作Qt Qml和Qt Quick模块的值类型的值。

其他Qt模块将在各自的模块页面上记录它们的值类型。

您可以像在从C++定义QML类型中描述的那样定义自己的值类型。为了使用特定QML模块提供的类型,客户端必须在他们的QML文档中导入该模块。

值类型的属性更改行为

一些值类型具有属性:例如,font类型具有pixelSizefamilybold属性。与对象类型的属性不同,值类型的属性不提供自己的属性更改信号。只能为值类型的属性本身创建属性更改信号处理程序

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公司或世界其他国家的商标。所有其他商标均为其各自所有者的财产。