モジュール
QtQuick 2.0
クラス継承
QQuickRepeater → QQuickItem → QObject
プロパティー
count: int = 0 readonly
delegate: Component = undefined default
model: QVariant = null
シグナル
void itemAdded(int index, Item item)
void itemRemoved(int index, Item item)
void countChanged()
void delegateChanged()
void modelChanged()
メソッド
Item itemAt(int index)
説明
delegate に設定されたビジュアルコンポーネントのオブジェクトを生成する。ビジュアルコンポーネントのみ生成できる。生成オブジェクトの親 QObject は nullptr になり、parent は Repeater の parent になる。生成したオブジェクトは Repeater が抱えていて itemAt() で参照できる。
生成オブジェクトには読込み専用プロパティー index に生成順が設定される。model が、整数、配列、文字列リスト、オブジェクトリストの場合には読込み専用プロパティー modelData に要素 (モデルが整数の場合には生成順) が設定される。
model に配列を設定した場合に、変更した配列を再設定すると全オブジェクトの破壊と再生成がされてしまう。以下のようにして配列にオブジェクトを入れれば、オブジェクトの破壊と生成をせずに配列要素の変更をオブジェクトに伝えられる。
objectlist.qml:
import QtQuick 2.10
import QtQuick.Window 2.10
Window {
id: window
visible: true
width: 200; height: 200
Component {
id: numberDelegate
QtObject {
property string name: "John Doe"
}
}
function createPerson(parent, name) {
return numberDelegate.createObject(parent, { "name": name });
}
Column {
Repeater {
id: repeater
model: [
createPerson(contentItem, "John Doe"),
createPerson(contentItem, "John Doe"),
createPerson(contentItem, "John Doe")
]
Text {
text: "Name is " + modelData.name
font.pointSize: 16
}
}
}
MouseArea {
anchors.fill: parent
onClicked: {
repeater.model[1].name = "JOHN SMITH";
}
}
}
プロパティーの説明
count: int
delegate: Component
オブジェクト生成に使われるコンポーネント。Component の id または Component を記述する。Component タイプの記述を省略した場合には暗黙のコンポーネントと呼ばれ自動的にコンポーネントにになる。model: QVariant
以下のいずれかを設定する。整数を指定した場合にはその数分のオブジェクトが生成され、他の場合には各要素に対してオブジェクトが生成される。
- 整数
- 配列
- 文字列リスト
- オブジェクトリスト
- ObjectModel や ListModel、QAbstractItemModel 継承モデルなど
配列を設定した場合に model を参照すると配列がコピーされて返される。配列を設定するときにも配列がコピーされる。QML カスタムプロパティーに配列オブジェクトを設定すると JavaScript の配列オブジェクトの扱いと同じように配列オブジェクトの参照が用いられるが、Repeater の model では配列オブジェクトがコピーされ、JavaScript の配列オブジェクトの扱いと異なっている。
配列を設定し、配列を再設定した場合の等価性判定は、配列オブジェクトが同じかどうかではなく、要素数と各要素が同じかどうかで判定される。こちらも JavaScript の配列オブジェクトの等価性判定と異なっている。
model に ObjectModel を設定した場合には delegate は設定しなくてよい。ObjectModel の要素がビジュアルデリゲートになるので、delegate を設定しても無視される。
シグナルの説明
void itemAdded(int index, Item item)
ビジュアルオブジェクトが追加されたときに送信されるシグナル。index は追加位置で item は追加されたビジュアルオブジェクト。void itemRemoved(int index, Item item)
ビジュアルオブジェクトを削除しようとするときに送信されるシグナル。index は削除位置で item は削除しようとするビジュアルオブジェクト。シグナルハンドラー onItemRemoved() を抜けた直後にビジュアルオブジェクトが削除される。メソッドの説明
Item itemAt(int index)
注意
ポジショナーやレイアウトとよく併用されるがビジュアルオブジェクトを生成してその parent を設定しているだけなのでこれらと併用せずに使える。
Repeater は Item を継承しているがポジショナーとレイアウトは Repeater を無視するようになっているので Repeater 自身はポジショナーとレイアウトで配置されない。
model に配列オブジェクトを設定参照したときの動作が Instantiator の model とは異なっている。
問題
Repeater のリファレンスに model に配列オブジェクトを設定参照した場合に参照ではなくコピーされることが書かれていない。
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。