本页内容

QML 类型系统

在 QML 文档中定义对象层次结构时可使用的类型可能来自多种来源。它们可能是:

  • 由 QML 语言原生提供
  • 由 QML 模块通过 C++ 注册的
  • 由 QML 模块作为 QML 文档提供

此外,应用程序开发人员还可以提供自己的类型,方法是直接注册 C++ 类型,或者在 QML 文档中定义可重用组件,然后将其导入。

无论类型定义来自何处,引擎都会对这些类型的属性和实例强制执行类型安全检查。

QML 对象类型

QML 对象类型是一种可用于实例化 QML 对象的类型。QML 对象类型继承自 `QtObject`,并由 QML 模块提供。应用程序可以导入这些模块来使用它们提供的对象类型。QtQuick 模块提供了在 QML 中创建用户界面所需的最常见的对象类型。

最后,每个 QML 文档都会隐式定义一个 QML 对象类型,该类型可在其他 QML 文档中重复使用。有关对象类型的深入信息,请参阅QML 类型系统中关于对象类型的文档。

QML 值类型

QML 语言内置支持多种基本类型,包括整数、双精度浮点数、字符串和布尔值。对象可以拥有这些类型的属性,这些类型的值也可以作为参数传递给对象的方法。

有关值类型的更多信息,请参阅QML 值类型文档。

QML 序列类型

序列类型可用于存储值或对象的序列。

有关序列类型的深入信息,请参阅QML 类型系统中关于序列类型的文档。

枚举

在 QML 中,枚举被视为类型的特殊属性。

有关枚举的详细信息,请参阅关于QML 枚举的文档。

单例类型

QML 支持单例类型,它提供了一种定义类型的方法,这种类型在每个 QML 引擎中仅存在一个实例。单例类型对于提供全应用程序范围的状态或功能非常有用。

有关更多详细信息,请参阅《QML 中的单例》。

附加类型

附加属性与信号处理程序允许类型提供额外的属性和信号,这些属性和信号可以附加到其他对象上。这是为 QML 对象添加上下文信息的一种强大机制。

更多详细信息,请参阅《QML 附加类型》。

QML 命名空间

QML 命名空间可用于公开来自 C++ 命名空间的枚举。

有关命名空间的深入信息,请参阅QML 类型系统中关于命名空间的文档。

JavaScript 类型

QML 引擎支持 JavaScript 对象和数组。任何标准 JavaScript 类型均可通过通用类型 `var ` 创建和存储。

例如,标准Date 和Array 类型均可使用,如下所示:

import QtQuick

Item {
    property var theArray: []
    property var theDate: new Date()

    Component.onCompleted: {
        for (var i = 0; i < 10; i++)
            theArray.push("Item " + i)
        console.log("There are", theArray.length, "items in the array")
        console.log("The time is", theDate.toUTCString())
    }
}

更多详细信息,请参阅《QML 文档中的 JavaScript 表达式》。

C++ 集成

QML 与 C++ 之间的数据类型转换

在将 QML 与 C++ 集成时,通常需要在两个环境之间传输数据。QML 引擎为常见数据类型提供了 QML 与 C++ 类型之间的自动转换,而自定义类型则需要显式注册。

更多详细信息,请参阅《QML 与 C++ 之间的数据类型转换》。

从 C++ 与 QML 对象交互

C++ 代码可以通过从 QML 引擎获取对 QML 对象的引用来访问和操作这些对象。这使得 C++ 代码能够读取和写入属性、调用方法,以及连接到 QML 对象的信号。

更多详细信息,请参阅《从 C++ 与 QML 对象交互》。

从 C++ 集成 JavaScript 值

QML引擎使用QJSValue 及相关类来表示JavaScript值,这使得C++代码能够操作JavaScript对象、函数和基本值。这实现了C++与JavaScript代码之间的无缝集成。

有关更多详细信息,请参阅《从 C++ 集成 JavaScript 值》。

使用上下文属性将 C++ 对象嵌入 QML

应避免使用上下文属性。更多详细信息,请参阅《使用上下文属性将 C++ 对象嵌入 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.