2018年3月28日

Instantiator

モジュール

QtQml 2.1

クラス継承

QQmlInstantiator → QObject

プロパティー

active: bool = true
asynchronous: bool = false
count: int = 0 readonly
delegate: Component = null default
model: QVariant = 1
object: QtObject = null readonly

シグナル

objectAdded(int index, QtObject object)
objectRemoved(int index, QtObject object)
activeChanged()
asynchronousChanged()
countChanged()
delegateChanged()
modelChanged()
objectChanged()

メソッド

QtObject objectAt(int index)

説明


delegate に設定されたコンポーネントのオブジェクトを生成する。コンポーネントはビジュアルと非ビジュアルのどちらでもよい。

生成オブジェクトの親 QObject は Instantiator になる。ビジュアルオブジェクトを生成したときにはその parent は null になる。
active.qml:

import QtQuick 2.10
import QtQuick.Window 2.10

Window {
    id: window

    visible: true

    width: 300; height: 300

    Instantiator {
        id: generator

        model: [ "red", "green", "blue", "yellow", "purple" ]
        active: false

        Rectangle {
            x: 25 + index*width; y: x
            width: 50; height: width

            color: modelData

            Component.onCompleted: {
                print("ctor", this, this.color);
            }

            Component.onDestruction: {
                print("dtor", this, this.color);
            }
        }

        onObjectAdded: {
            object.parent = window.contentItem;
        }
    }

    MouseArea {
        anchors.fill: parent

        onClicked: {
            generator.active = !generator.active;
        }
    }
}
オブジェクト追加時に parent を設定して表示されるようにしている。この設定をしないと表示されない。実行すると以下のようになり、active の切り替えでオブジェクトの生成と破壊がされているのがわかる。
qml: ctor QQuickRectangle(0x7fed5de5a300) #ff0000
qml: ctor QQuickRectangle(0x7fed5de5d540) #008000
qml: ctor QQuickRectangle(0x7fed5de5e3e0) #0000ff
qml: ctor QQuickRectangle(0x7fed5de5f280) #ffff00
qml: ctor QQuickRectangle(0x7fed5de60120) #800080
qml: dtor QQuickRectangle(0x7fed5de5a300) #ff0000
qml: dtor QQuickRectangle(0x7fed5de5d540) #008000
qml: dtor QQuickRectangle(0x7fed5de5e3e0) #0000ff
qml: dtor QQuickRectangle(0x7fed5de5f280) #ffff00
qml: dtor QQuickRectangle(0x7fed5de60120) #800080

プロパティーの説明

active: bool

true のときに delegate にコンポーネントが設定されていて status が Component.Ready ならばモデルに対してオブジェクトを生成する。false ならばオブジェクトは生成せず、生成オブジェクトがあれば破壊する。

asynchronous: bool

true ならば非同期にオブジェクトを生成する。

count: int

生成し抱えているオブジェクト数。

delegate: Component

オブジェクト生成に使われるコンポーネント。

生成オブジェクトには読込み専用プロパティー index に生成順が設定される。model が、整数、配列、文字列リスト、オブジェクトリストの場合には読込み専用プロパティー modelData に要素 (整数の場合には生成順) が設定される。

model: QVariant

以下のいずれかを設定する。整数を指定した場合にはその数分のオブジェクトが生成され、他の場合には各要素に対してオブジェクトが生成される。
  • 整数
  • 配列
  • 文字列リスト
  • オブジェクトリスト
  • ObjectModel や ListModel、QAbstractItemModel 継承モデルなど
配列を設定した場合に model を参照すると配列への参照が返される。

配列を設定し、同じ配列を再設定した場合でもオブジェクトの削除と生成がされる。

object: QtObject

生成したオブジェクトがあれば 1 番目に生成したオブジェクトへの参照が設定される。オブジェクトをひとつしか生成しない場合にオブジェクトの参照を簡単にするために用意されている。

シグナルの説明

objectAdded(int index, QtObject object)

オブジェクトが追加されたときに送信されるシグナル。index は追加位置で object は追加されたオブジェクト。

objectRemoved(int index, QtObject object)

オブジェクトを削除しようとするときに送信されるシグナル。index は削除位置で object は削除しようとするオブジェクト。シグナルハンドラー onObjectRemoved() を抜けた直後にオブジェクトが削除される。

active を false にしたときには objectRemoved() の中では count は生成して抱えたオブジェクト数のままで、全オブジェクトの削除後に count が 0 になる。

メソッドの説明

QtObject objectAt(int index)

index で指定した位置のオブジェクトへの参照を返す。

注意


model を参照したときの動作が Repeater の model とは異なっている。

参考情報

Instantiator QML Type
Repeater

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。