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 に渡すことができます。これにはQList,QQueue,QStack,QSet, std::list, std::vector のうちQ_DECLARE_METATYPE でマークされた型が登録されているものが含まれます。

QMetaSequence 経由でシーケンスを使用すると、高価なデータ変換が発生します。変換を回避するには、C++のQML_SEQUENTIAL_CONTAINER を使用して、独自の無名シーケンス型を登録します。このようにして登録された型は、定義済みのシーケンス型と同じように振る舞い、そのまま保存されます。ただし、これらの型にはQML名はありません。

警告 QListstd::vector のような C++ コンテナとして格納されたシーケンスは、QML の 値型やシーケンス参照による影響を受けるため、その扱いには注意が必要です。QQmlListProperty は、あくまでも基礎となるコンテナのビューであるため、影響を受けません。std::vector のようなC++標準のコンテナは暗黙の共有ではありません。したがって、これらをコピーすると、常にディープコピーが生成されます。プロパティから読み出されたシーケンスは常に少なくとも一度はコピーされなけれ ばならないので、このようなコンテナをQMLのシーケンスとして使うことは、たとえQMLから 変更しなかったとしても、かなり高くつきます。

QtQml モジュールにはいくつかのsequence types があります。

©2024 The Qt Company Ltd. 本書に含まれる文書の著作権は、それぞれの所有者に帰属します。 ここで提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。