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 sequence[i]) を使用せず、代わりにsplice 関数 (sequence.splice(startIndex, deleteCount)) を使用してください。

一般的に、QMetaSequence で認識可能なコンテナは、Q_PROPERTY またはQ_INVOKABLE メソッドを介して C++ から QML へ渡すことができます。これには、Q_DECLARE_METATYPE でマークされた型を含む、登録済みのすべてのQList 、QQueue 、QStack 、QSet 、std::list、std::vector が含まれますが、これらに限定されません。

QMetaSequence 経由でシーケンスを使用すると、負荷の高いデータ変換が発生します。この変換を回避するには、C++ からQML_SEQUENTIAL_CONTAINER を使用して独自の匿名シーケンス型を登録できます。この方法で登録された型は、事前定義されたシーケンス型と同様に動作し、そのままの状態で格納されます。ただし、QML 名は割り当てられません。

警告: QList やstd::vector のような C++ コンテナとして格納されたシーケンスは 、QML の値型およびシーケンス参照による影響を受けるため、取り扱いには注意が必要です。QQmlListProperty は、基になるコンテナのビューに過ぎないため、この影響を受けません。std::vector などの C++ 標準コンテナは、暗黙的に共有されることはありません。 したがって、これらをコピーすると常にディープコピーが行われます。プロパティから読み込まれたシーケンスは常に少なくとも 1 回はコピーされる必要があるため、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.