QML 值类型

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

值类型在概念上是通过值而不是通过引用传递的,如intstring 。这与QML 对象类型(Object Types)不同。对象类型是通过引用传递的。如果你把对象类型的实例分配给两个不同的属性,两个属性都会带有相同的值。修改对象会反映在两个属性中。如果将一个值类型的实例分配给两个不同的属性,则这两个属性会分别携带不同的值。如果修改其中一个属性,另一个属性将保持不变。值类型只是在概念上通过值进行传递,因为必须仍能像 JavaScript 对象一样与它们进行交互。为方便起见,在现实中,当你从 JavaScript 代码中访问值类型时,它们是作为值类型引用传递的。

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

值类型可用于指代

  • 单个值(如int 指单个数字)
  • 包含属性和方法的值(例如,size 指的是包含widthheight 属性的值)
  • 通用类型var 。它可以容纳任何其他类型的值,但本身也是一种值类型。

当一个变量或属性持有一个值类型,并将其分配给另一个变量或属性时,就形成了该值的副本。

可用的值类型

引擎默认支持某些值类型,使用时不需要导入语句,而其他值类型则需要客户端导入提供这些值类型的模块。下面列出的所有值类型都可以在 QML 文档中用作property 类型,但以下情况除外:

  • void, 表示没有值
  • list 必须与对象或值类型一起作为元素使用。

QML 语言提供的内置值类型

QML 语言本地支持的内置值类型如下:

bool

二进制真/假值

date

日期值

double

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

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

向量 2d 类型具有 x 和 y 属性

vector3d

具有 x、y 和 z 属性的值

vector4d

向量 4d 类型具有 x、y、z 和 w 属性

Qt 全局对象为操作值类型的值提供了useful functionsQt QmlQt Quick模块的值类型。

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

您可以定义自己的值类型,如《从 C++ 定义 QML 类型》(Defining QML Types from C++)一文所述。要使用特定 QML 模块提供的类型,客户端必须在 QML 文档中导入该模块。

值类型的属性更改行为

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

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 类型系统

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.