本页内容

QML 值类型

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

值类型是指从概念上讲按值传递而非按引用传递的类型,例如int 或string 。这与QML对象类型形成对比。对象类型是按引用传递的。 若将对象类型的实例赋值给两个不同的属性,这两个属性将持有相同的值。修改该对象会同时反映在两个属性上。若将值类型的实例赋值给两个不同的属性,这两个属性将持有各自独立的值。修改其中一个时,另一个保持不变。 值类型仅在概念上按值传递,因为必须能够像操作 JavaScript 对象一样与它们交互。为了实现这一点,当您从 JavaScript 代码访问它们时,实际上它们是以值类型引用(Value Type References)的形式传递的。

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

值类型可用于引用:

  • 单个值(例如,int 表示一个单独的数字)
  • 包含属性和方法的值(例如,size 指代一个具有width 和height 属性的值)
  • 泛型类型 `var`。它可以容纳任何其他类型的值,但本身是一个值类型。

当变量或属性持有值类型,且将其赋值给另一个变量或属性时,会生成该值的副本。

可用的值类型

某些值类型默认受引擎支持,使用时无需导入语句;而另一些则需要客户端导入提供该类型的模块。以下列出的所有值类型均可在 QML 文档中用作property 类型,但以下例外情况除外:

  • void,该符号表示没有值
  • list 必须与对象或值类型结合使用,作为元素

QML 语言提供的内置值类型

QML 语言原生支持的内置值类型如下:

bool

二进制 true/false 值

date

日期值

double

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

int

整数,例如 0、10 或 -20

list

QML 对象列表

real

带小数的数值

string

自由格式文本字符串

url

资源定位器

var

通用属性类型

variant

通用属性类型

void

空值类型

QML 模块提供的值类型

QML 模块可以通过提供更多值类型来扩展 QML 语言。

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

easingCurve

表示缓动曲线的值

point

具有 x 和 y 属性的值

qmlProperty

引用对象属性的值

rect

具有 x、y、width 和 height 属性的值

size

具有 width 和 height 属性的值

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

color

ARGB 颜色值

font

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

matrix4x4

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

quaternion

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

vector2d

vector2d 类型具有 x 和 y 属性

vector3d

具有 x、y 和 z 属性的值

vector4d

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

全局对象Qt 提供了useful functions ,用于操作以下值类型的值: Qt Qml 和 Qt Quick 模块中操作值类型的值,提供了xml-ph-0001@deepl.internal。其他 Qt 模块将在各自的模块页面上记录其值类型。

其他 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 类型系统》。

© 2026 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.