ListModel QML Type
自由形式のリスト・データ・ソースを定義します。詳細...
Import Statement: | import QtQml.Models |
プロパティ
- count : int
- dynamicRoles : bool
メソッド
- append(jsobject dict)
- clear()
- object get(int index)
- insert(int index, jsobject dict)
- move(int from, int to, int n)
- remove(int index, int count)
- set(int index, jsobject dict)
- setProperty(int index, string property, variant value)
- sync()
詳細説明
ListModel はListElement 定義のシンプルなコンテナであり、それぞれがデータの役割を含んでいます。内容は動的に定義することも、QML で明示的に定義することもできます。
モデル内の要素数はcount プロパティから取得することができます。モデルの内容を操作するために、append()、insert()、move()、remove()、set() などのおなじみのメソッドも用意されています。これらのメソッドは、引数として辞書を受け取ります。これらの辞書は、モデルによってListElement オブジェクトに変換されます。
要素は、setProperty() メソッドを使ってモデルから操作することができます。このメソッドでは、指定した要素のロールを設定したり変更したりすることができます。
ListModel はQAbstractListModel を継承し、そのQ_INVOKABLE メソッドを提供します。例えば、QAbstractItemModel::index を使って、行と列のQModelIndex を取得することができます。
使用例
以下の例では、"name" と "cost" というロールを持つ、3つの要素を含む ListModel を示しています。
import QtQuick ListModel { id: fruitModel ListElement { name: "Apple" cost: 2.45 } ListElement { name: "Orange" cost: 3.25 } ListElement { name: "Banana" cost: 1.95 } }
各要素の役割(プロパティ)は、小文字で始まり、モデル内の全ての要素に共通でなければなりません。要素の定義方法については、ListElement のドキュメントに詳細なガイドラインが記載されています。
この例のモデルにはid
プロパティが含まれているため、この例のListView のようなビューによって参照することができます:
import QtQuick Rectangle { width: 200; height: 200 ListModel { id: fruitModel ... } Component { id: fruitDelegate Row { spacing: 10 Text { text: name } Text { text: '$' + cost } } } ListView { anchors.fill: parent model: fruitModel delegate: fruitDelegate } }
ロールにリスト・データを含めることができます。以下の例では、果物属性のリストを作成します:
ListModel { id: fruitModel ListElement { name: "Apple" cost: 2.45 attributes: [ ListElement { description: "Core" }, ListElement { description: "Deciduous" } ] } ListElement { name: "Orange" cost: 3.25 attributes: [ ListElement { description: "Citrus" } ] } ListElement { name: "Banana" cost: 1.95 attributes: [ ListElement { description: "Tropical" }, ListElement { description: "Seedless" } ] } }
デリゲートは、すべての果物属性を表示します:
Component { id: fruitDelegate Item { width: 200; height: 50 Text { id: nameField; text: name } Text { text: '$' + cost; anchors.left: nameField.right } Row { anchors.top: nameField.bottom spacing: 5 Text { text: "Attributes:" } Repeater { model: attributes Text { text: description } } } } }
リスト・モデルの変更
リスト・モデルの内容は、clear()、append()、set()、insert()、setProperty() メソッドを使用して作成および変更することができます。例えば
Component { id: fruitDelegate Item { width: 200; height: 50 Text { text: name } Text { text: '$' + cost; anchors.right: parent.right } // Double the price when clicked. MouseArea { anchors.fill: parent onClicked: fruitModel.setProperty(index, "cost", cost * 2) } } }
コンテンツを動的に作成する場合、一度設定された利用可能なプロパティのセットは変更できないことに注意してください。最初にモデルに追加されたプロパティが、モデル内で許可された唯一のプロパティです。
スレッド化されたリストモデルを WorkerScript で使用する
ListModel をWorkerScript とともに使用することで、複数のスレッドからリストモデルにアクセスすることができます。これは、リストの変更が同期的で時間がかかる場合に便利です。リスト操作を別のスレッドに移動することで、メイン GUI スレッドのブロックを回避することができます。
以下は、WorkerScript を使ってリスト・モデルに定期的に現在時刻を追加する例です:
Timer { id: timer interval: 2000; repeat: true running: true triggeredOnStart: true onTriggered: { var msg = {'action': 'appendCurrentTime', 'model': listModel}; worker.sendMessage(msg); } }
dataloader.mjs
は次のようなファイルです:
WorkerScript.onMessage = function(msg) { if (msg.action == 'appendCurrentTime') { var data = {'time': new Date().toTimeString()}; msg.model.append(data); msg.model.sync(); // updates the changes to the list } }
メインの例のタイマーは、WorkerScript::sendMessage ()を呼び出すことで、ワーカースクリプトにメッセージを送信します。このメッセージを受信すると、dataloader.mjs
内でWorkerScript.onMessage()
が呼び出され、リスト・モデルに現在時刻が追加されます。
外部スレッドからsync() が呼び出されていることに注意してください。sync ()を呼び出さないと、そのスレッドからリストに加えられた変更がメイン・スレッドのリスト・モデルに反映されません。
プロパティー ドキュメント
count : int |
モデル内のデータ・エントリーの数。
dynamicRoles : bool |
デフォルトでは、ロールが最初に使用されるとき、ロールの型は固定されます。例えば、"data "というロールを作成し、それに数値を割り当てた場合、"data "ロールに文字列を割り当てることはできなくなります。しかし、dynamicRolesプロパティを有効にすると、与えられたロールの型は固定されず、要素間で異なることができます。
dynamicRoles プロパティは、ListModel にデータが追加される前に設定する必要があり、メイン・スレッドから設定する必要があります。
データを静的に定義した(ListElement QML構文を使用した)ListModel では、dynamicRolesプロパティを有効にすることはできません。
動的ロールを有効にしたListModel を使用するには、かなりのパフォーマンス・コストがかかります。このコストはプラットフォームによって異なりますが、通常、静的ロール・タイプを使用するよりも4~6倍遅くなります。
動的ロールの使用にはパフォーマンス・コストがかかるため、デフォルトでは無効になっています。
メソッドのドキュメント
append(jsobject dict) |
clear() |
object get(int index) |
リスト・モデルのindex にある項目を返します。これにより、JavaScript からアイテムのデータにアクセスしたり、変更したりすることができます:
Component.onCompleted: { fruitModel.append({"cost": 5.95, "name":"Jackfruit"}); console.log(fruitModel.get(0).cost); fruitModel.get(0).cost = 10.95; }
index はリストの要素でなければなりません。
返されたオブジェクトの、それ自身がオブジェクトであるプロパティもまたモデルになり、この get() メソッドは要素にアクセスするために使用されることに注意してください:
fruitModel.append(..., "attributes": [{"name":"spikes","value":"7mm"}, {"name":"color","value":"green"}]); fruitModel.get(0).attributes.get(1).value; // == "green"
警告: 警告: 返されるオブジェクトの有効性は保証されません。警告:返されたオブジェクトは、その有効性が保証されていません。プロパティ・バインディングや、ListModel の変更に渡ってデータを保存するために使用すべきではありません。
insert(int index, jsobject dict) |
n 項目from をある位置to に移動する。
fromとtoの範囲が存在する必要があります。例えば、最初の3つの項目をリストの最後に移動する場合などです:
fruitModel.move(0, fruitModel.count - 3, 3)
append()も参照 。
set(int index, jsobject dict) |
リスト・モデルのindex の項目をdict の値で変更します。dict にないプロパティは変更されません。
fruitModel.set(3, {"cost": 5.95, "name":"Pizza"})
index が count() と等しい場合、新しい項目がリストに追加されます。そうでない場合、index はリストの要素でなければなりません。
append()も参照 。
リスト・モデルのindex にある項目のproperty をvalue に変更します。
fruitModel.setProperty(3, "cost", 5.95)
index はリストの要素でなければなりません。
append()も参照して ください。
sync() |
ワーカースクリプトから変更された後、保存されていない変更をリストモデルに書き込みます。
本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。