このページでは

C

list QML Value Type

リスト。さらに...

Since: Qt Quick Ultralite 2.9

詳細説明

list 型はQMLのオブジェクトや値のリストを指す。

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

list には QML コンポーネントやQML ベーシックの型を格納することができます。また、Qul::Object を継承した C++ 型を格納することもできます。

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

C++ と統合する場合、Qul::ListProperty は自動的に QML のlist プロパティに変換されます。

リスト型の使用

例えば、AnimationTimeline はリスト型のプロパティを持っています。次の例は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 はanimations のリストにTimelineAnimation のオブジェクトを定義された順番に追加します。

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

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 として格納されます.
  • 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 を使ったこの方法の詳細については、Split large ListModelsを参照してください。この方法は、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の配列とはサイズ変更の扱い方が異なります。JavaScriptの配列が未定義のエントリを追加するのに対して、length プロパティを増やすことによって前者のサイズを変更すると、値型のデフォルトで構成されたインスタンスが追加されます。

同様に、オブジェクト型のリストのサイズを変更すると、デフォルトのコンストラクタがない場合はエラーになります。この動作はQt Quick Ultralite では Qt と異なり、オブジェクトの拡張リストはデフォルトで構築されたオブジェクトではなくnull の値で満たされます。

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

QMLでのリストの初期化

List Storage セクションで説明したように、Qt Quick Ultralite ではリストのリサイズをするかしないかによって、2つの保存方法があります。C++またはQMLから少なくとも一度リストを初期化する。そうでない場合、格納はnull に設定される。

Qt Quick 特別なQMLキーワードが使われていない場合、Ultraliteはデフォルトで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 キーワードの使用を検討してください。

static_list をカスタム QML リストにも使用することで、次の例のように特定のストレージサイズを割り当てることができます:

使い方

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 ライセンスの下で利用可能です。
詳細はこちら。