C
list QML Value Type
リスト。続きはこちら...
| Since: | Qt Quick Ultralite 2.9 |
- listは、Qt Quick のUltralite QML基本型の一部です。
詳細な説明
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 では、カスタムリストプロパティを宣言することもできます:
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基本型(QML Basic Types)の値へのバインドはサポートされていません。
リスト内の基本型の値でプロパティを初期化する場合、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 では異なります。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 }]) }この問題を回避するには、オブジェクトを別のリストで初期化し、その
idをstatic_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ライセンスの下で利用可能です。
詳細はこちらをご覧ください。