QtQuick の ListView.onAdd は Attached Signal

onAdd のドキュメント ですが、ListView のドキュメントの中の「Attached Signal Documentation」というセクションにあります。

Attached と書いてある場合は、通常のプロパティやシグナルではなく、そのエレメントの子エレメント(や子となる Component)の中に以下ののように書くことになります。

Element.property: value
Element.onSignal: variant = value

ListView.onAdd の場合は ListView の delegate の中で使われることを想定しています。

アイテムが新規に追加された祭の処理を ListView の delegate で行いたい場合に、delegate の中で以下のように記述します。

ListView {
    delegate: Item {
        ListView.onAdd: { ... }
    }
}

ListView の delegate はスクロールの位置に応じて動的に生成/破棄されるため、通常使用する Component.onCompleted は使用できません。

ListView.onAdd を使用した簡単なサンプルは以下のようになります。

import QtQuick 2.0

ListView {
    width: 180
    height: 360

    model: ListModel { id: model }
    delegate: Item {
        id: delegate
        width: ListView.view.width
        height: 60
        Rectangle {
            x: 10; y: 10; width: 60 - 20; height: delegate.height - 20
            color: model.color
        }
        Text { anchors.verticalCenter: parent.verticalCenter; x: 60; text: model.color }

        ListView.onAdd: SequentialAnimation {
            NumberAnimation { target: delegate; property: 'height'; from: 0; to: delegate.height; duration: 200; easing.type: Easing.InOutQuad }
        }
    }

    Timer {
        interval: 500
        repeat: true
        running: true
        onTriggered: {
            model.insert(0, {'color': Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0).toString()})
        }
    }
}

おすすめ