QML 序列类型

对于每种对象类型和值类型,系统都会自动提供一种序列类型,用于存储该类型的多个实例。您可以使用list 关键字 来创建序列类型的属性:

import QtQml

QtObject {
    property list<int> ints: [1, 2, 3, 4]
    property list<Connection> connections: [
        Connection {
            // ...
        },
        Connection {
            // ...
        }
    ]
}

值类型的序列以 `QList ` 形式实现,而对象类型的序列则以 `QQmlListProperty` 形式实现。

QML 中的序列通常表现得像 JavaScript 中的 `Array ` 类型,但由于实现中使用了 C++ 存储类型,因此存在一些重要差异:

  1. 从序列中删除一个元素后,该元素将被默认构造的值替换,而非undefined 值。
  2. 将序列的 `length ` 属性设置为大于其当前值的数值时,序列会使用默认构造的元素(而非 `undefined ` 元素)填充至指定长度。
  3. Qt 容器类支持有符号(而非无符号)整数索引;因此,尝试访问大于qsizetype 所能容纳的最大数的任何索引都会失败。

如果您希望从序列中删除元素,而不是简单地将其替换为默认构造的值,请不要使用带索引的 delete 运算符(delete sequence[i] ),而应使用splice 函数(sequence.splice(startIndex, deleteCount) )。

通常,任何可被QMetaSequence 识别的容器,均可通过Q_PROPERTY 或Q_INVOKABLE 方法从 C++ 传递到 QML。这包括但不限于所有已注册的QList 、QQueue 、QStack 、QSet 、std::list、std::vector,且这些容器中包含带有Q_DECLARE_METATYPE 标记的类型。

通过QMetaSequence 使用序列会导致耗时的数据转换。为避免这些转换,您可以在 C++ 中使用QML_SEQUENTIAL_CONTAINER 注册自己的匿名序列类型。以这种方式注册的类型行为与预定义的序列类型相同,且按原样存储。但是,它们没有 QML 名称。

警告: 以 C++ 容器(如QList 或std::vector )形式存储的序列会 受到QML 值类型和序列引用影响,因此应谨慎处理。QQmlListProperty 不受影响,因为它只是底层容器的视图。C++ 标准容器(如std::vector )不会被隐式共享。 因此,复制它们时总是会生成深度复制。由于从属性读取的序列必须至少复制一次,因此将此类容器用作 QML 序列的开销相当大,即使您未在 QML 中对其进行修改也是如此。

QtQml 模块中包含了一些sequence types ,您可能需要使用它们。

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