このページでは

C

list QML Value Type

リスト。続きを読む...

Since: Qt Quick Ultralite 2.9

詳細な説明

list 型は、QMLオブジェクトまたは値のリストを指します。

すべてのリストを使用可能にするには、Cpp またはQML から少なくとも一度は初期化する必要があります。詳細については、List Storage を参照してください。

list には、QML コンポーネントやQML Basic 型を格納できます。また、Qul::Object を継承する C++ 型も格納できます。

注: MyComponent がインラインコンポーネントである場合、list <MyComponent>はサポートされません。

C++との統合において、Qul::ListProperty が自動的にQMLのlist プロパティに変換されるわけではなく、その逆も同様であることに注意してください。

list 型の使用

たとえば、Animation 型やTimeline には、リスト型のプロパティがあります。以下の例は、QML でそのようなプロパティを使用する方法を示しています:

import QtQuick

Item {
    width: 100; height: 100

    // Object list
    Timeline {
        id: timeline
        animations: [
            TimelineAnimation { running: true; pingPong: true},
            TimelineAnimation { running: false; pingPong: false}
        ]
    }

    // basic list
    NumberAnimation on x {
        easing.bezierCurve: [0.455, 0.030, 0.515, 0.955, 1, 1]
        easing.type: Easing.BezierSpline
    }

    // accessing lists
    Component.onCompleted: {
        for (var i = 0; i < states.length; i++)
            console.log(
            "Animation %1 running : %2 "
            .arg(i)
            .arg(timeline.animations[i].running));
    }
}

Qt Quick Ultralite は、TimelineAnimation オブジェクトを、定義された順序でanimations リストに追加します。

注: リストにオブジェクトが1つしか含まれていない場合、Qt Quick Ultraliteでの動作はQt XMLとは異なります。このような場合は、角括弧を省略しないでください。

QML では、カスタムリストプロパティを宣言することもできます:

import QtQml

QtObject {
    property list numberList: [1, 2, 3, 4]
    property list<QtObject> objectList
}

Qt Quick UltraliteツールはQt Quick 6.2.xに依存していますが、このバージョンではQML基本型のリストに対してテンプレート型を使用することはできません。ただし、オブジェクトのリストに対してはテンプレート型を指定することが可能です。Qt Quick Ultraliteは、リスト項目から基本値の型を次のように推論します:

  • Numbers:Qul::ListProperty<qreal> として格納されます。
  • String: 内部のQt Quick Ultralite文字列型として最適化されます。
  • Booleans:Qul::ListProperty<bool> として格納されます。
  • Enums: リスト項目の対応する列挙型が使用されます。
  • Points: リスト項目が `Qt.point(x,y)` を使用して点として定義されている場合、それらは `Qul::PlatformInterface::PointF` として保存されます。
  • Rectangles: リスト項目が `Qt.rect(x,y,w,h)` を使用して矩形として定義されている場合、それらは `Qul::PlatformInterface::RectF` として格納されます。
  • Matrix4x4: リスト項目が `Qt.matrix4x4(m00,m01,...m16)` を使用して `matrix4x4` として定義されている場合、それらは `Qt Quick `(matrix4x4 用の Ultralite 内部型)として格納されます。
  • Colors: リスト項目が `Qt.rgba(r,g,b,a)` を使用して色として定義されている場合、それらはQul::PlatformInterface::Rgba32

例:

property list mylist_custom_double : [1.1, 2.2, 3.3, 4.4]
property list mylist_custom_bool : [true, false, true, false]
property list mylist_custom_enum : [TestObject.Value1, TestObject.Value2, TestObject.Value3, TestObject.Value1]
property list mylist_custom_string : ["a", "b", "c", "d"]
property list mylist_custom_rects: [
    Qt.rect(0, 0, 100, 100),
    Qt.rect(100, 0, 100, 100)
]

注:リストの各 項目同じ型である必要があります。そうでない場合、コンパイル時にエラーが発生します。

そのような場合は、JavaScriptの配列と同様にリストを使用してください。ただし、リストに対して使用できる関数には制限があります。Qt Quick Ultraliteでは、このようなリストに対して以下の操作をサポートしています:

  • 値の割り当ては、[] の角括弧構文を使用し、値をコンマ区切りで指定します
  • length プロパティは、リスト内の項目数を返します
  • リスト内の値へのアクセスには、[index] 構文を使用します
  • push() を使用してエントリを追加できます
  • リストの `length ` プロパティを設定することで、リストを切り詰めたり拡張したりできます。
  • removeLast() を使用すると、リストの最後の項目を削除できます

ただし、現在範囲外にあるインデックスに値を代入して、リストを自動的に拡張することはできません。

注: C++でオブジェクトのリストを宣言し、QML で初期化を行う場合は 、ポインタ型を使用して宣言してください。これは、生成された C++ コードに QML オブジェクトを格納するために使用される最適化手法のため、必要な処理です。

struct MyObject : public Qul::Object
{
    // use 'Component*' and not 'Component'
    Qul::ListProperty<MyComponent*> components;
};
import QtQuick
MyObject {
    components: [
        MyComponent { }
    ]
}

オブジェクトのリストがあり、通常のProperty である「p0」をリスト項目のプロパティ「p1」にバインドした場合、「p1」が変更されると「p0」の値は自動的に更新されます。

Item {
    property list<MyData> myDataList: [
        MyData { val: 100 },
        MyData { val: 200 }
    ]
    property int value2: myDataList[1].val
    function updateValue2(newValue) {
        // value2 property is updated automatically
        myDataList[1].val = newValue
    }
}

Qt Quick Ultraliteでは現在、リストへのバインドや、リスト内のQML基本型の値へのバインドはサポートされていません。

リスト内の基本型の値でプロパティを初期化する場合、Qt Quick Ultraliteはリストへのバインドを行わずに、リストから値をコピーします。値を再度更新する必要がある場合は、関数またはシグナルハンドラ内でその処理を行ってください。

基本型のバインディングを避けることができれば、ROMの使用量を削減できます。ListModels での具体的な方法については、「大規模なListModelの分割」を参照してください。このアプローチは、ListElement のプロパティが変化しない場合に特に有効です。

QMLの基本型と同様に、length プロパティもコピーされ、バインディングは行われません。サイズが拡大または縮小するモデルのlength プロパティを更新するには、別の関数またはシグナルハンドラを使用してください。

Item {
    property list<MyData> myDataList: [
        MyData { val: 100 },
        MyData { val: 200 }
    ]
    property int value2: myDataList[1].val
    function updateValue2(newValue) {
        // value2 property is updated automatically
        myDataList[1].val = newValue
    }
}

値型の一覧は、サイズ変更の処理方法において JavaScript の配列とは異なります。前者のサイズを変更するために `length ` プロパティを増やすと、その値型のデフォルトコンストラクタで生成されたインスタンスが追加されますが、JavaScript の配列の場合は未定義のエントリが追加されます。

同様に、オブジェクト型のリストのサイズを変更する場合、デフォルトコンストラクタが存在しないとならエラーが発生します。この挙動は、Qt Quick Ultralite と Qt XML では異なります。Qt XML では、拡張されたオブジェクトのリストは、デフォルトで生成されたオブジェクトではなく、null 値で埋められます。

注: Qt Quick Ultralite では、C++ からエクスポートされた列挙型は基本値型とみなされます。

QML でのリストの初期化

List Storage 」のセクションで説明されているように、Qt Quick Ultralite では、リストのサイズ変更が必要かどうかによって、リストを格納する方法が 2 通りあります。C++ または QML から少なくとも 1 回はリストを初期化してください。そうしないと、ストレージは `null` に設定されます。

Qt Quick Ultraliteでは、特別なQMLキーワードが使用されていない場合、デフォルトでDynamicList を使用してリストを格納します。以下の例は、このユースケースを示しています:

MyObject {
    //Custom list, will use a dynamic list by default
    property list numbers: [1, 2, 3, 4]
    // defined in c++, it will use a dynamic list as well
    numbers_cpp: [1, 2, 3, 4]
}

ヒープ割り当てを回避するには、次のように `readonly` キーワードを使用して、デフォルトの動作を変更し、代わりに `StaticList ` を利用することができます:

MyObject {
    //Custom list, will use a static list
    readonly property list points: [Qt.point(1,2), Qt.point(3,4)]
}

`readonly` キーワードは、.qml ファイルで宣言されたカスタムリストに対してのみ使用できます。C++ で静的リストを宣言し、QML で使用するには、static_list の初期化関数を使用します。以下の例は、その方法を示しています:

  • static_list(array): 最も単純な使用例は、静的リストに配列を格納することです。
    MyCppObject {
        // numbers declared as ListProperty<int>
        numbers: static_list([1, 2, 3, 4])
    }
  • static_list(array, size): すべての項目を明示的に初期化せずに静的リストにメモリを割り当て、バッファとして使用します。残りの項目については、デフォルトコンストラクタが呼び出されます。

    デフォルトコンストラクタを定義せずに型を初期化すると、ビルド時のエラーが発生します。

    MyCppObject {
        // numbers declared as ListProperty<int>
        numbers: static_list([1, 2, 3, 4], 100)
    }
  • static_list(initializer_list [, size]): オブジェクトの静的リストを作成したい場合、構文上の制限により、以下に示すように関数内でリスト内のオブジェクトを初期化することはできません:
    MyCppObject {
        // objects declared as ListProperty<Data*>
        // !!!! this will not compile
        objects: static_list([MyData { value: 1 }, MyData { value: 2 }])
    }

    この問題を回避するには、別のリスト内でオブジェクトを初期化し、そのidstatic_list に渡すという方法があります。

    注: data_init オブジェクトの初期化にのみ使用され、QMLファイル内ではそれ以降、読み取りや書き込みは行われません。

    MyCppObject {
        property list<Data> data_init: [MyData { value: 1 }, MyData { value: 2 }]
        // objects declared as ListProperty<Data*>
        objects: static_list(data_init, 100)
    }

    リストのサイズを明示的に設定するにはこのアプローチが必要ですが、そうでない場合は、代わりにreadonly キーワードの使用を検討してください。

以下の例に示すように、特定のストレージサイズを割り当てるには、カスタム QML リストでも `static_list ` を使用してください。

使用方法:

Item {
    id: root
    property list int_list: [1, 2, 3, 4]
    property list int_list2: [4, 3, 2, 1]
    property int at2: root.int_list[2]
    property int counter: 0
    function test_lists() {
      for (var i=0; i < 4; i ++){
        counter = int_list[i]  // access
        console.log(int_list[i])
      }
      int_list[i] = 0   // assignment
      int_list.length = 20 // truncate (expand)
      int_list.removeLast() // removeLast
      int_list = int_list2 // list to list assignment
    }
}

QMLの基本型も参照してください

特定のQtライセンスの下で利用可能です。
詳細はこちらをご覧ください。