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++のストレージ型を使用しているためにいくつかの重要な違いがあります:
- シーケンスから要素を削除すると、
undefined
の値ではなく、デフォルトで構成された値がその要素に置き換わります。 - シーケンスの
length
プロパティを現在の値よりも大きな値に設定すると、シーケンスはundefined
要素ではなくデフォルトで構成された要素で指定された長さまでパディングされます。 - Qt コンテナクラスは(符号なしではなく)符号付きの整数インデックスをサポートしています。そのため、qsizetype が保持できる最大数を超えるインデックスにアクセスしようとすると失敗します。
シーケンスから要素を削除する場合、単にデフォルトの値に置き換えるのではなく、インデックス付き削除演算子(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名はありません。
警告 QList やstd::vector
のような C++ コンテナとして格納されたシーケンスは、QML の 値型やシーケンス参照による影響を受けるため、その取り扱いには注意が必要です。QQmlListProperty は、あくまでも基礎となるコンテナのビューであるため、影響を受けません。std::vector
のようなC++標準のコンテナは暗黙の共有ではありません。したがって、これらをコピーすると、常にディープコピーが生成されます。プロパティから読み出されたシーケンスは常に少なくとも一度はコピーされなけれ ばならないので、このようなコンテナをQMLのシーケンスとして使うのは、たとえQMLから 変更しなかったとしても、かなりコストがかかります。
QtQml モジュールにはいくつかのsequence types があります。
© 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.