Search code examples
qtqmlrepeaterqtquick2

Repeater access elements


I have the following Repeater:

Repeater{
    id: rainDropId
    model: 200

    delegate: Rectangle {

        x: Math.floor(Math.random() * windowId.width)
        y: Math.floor(Math.random() * windowId.height)
        property int mLayer: Math.floor(Math.random() * 4) + 1

        property double mYSpeed: -2.0 * mLayer

        width:5
        height:5
        color: "#3399FF"
        radius: width*0.5
    }
}

And I have a Timer. I want to modify the positions of all elements from the Repeater according to their own properties. How can I access something like rainDropId[index] from the Timer?

Thanks


Solution

  • Use Repeater's itemAt() method:

    import QtQuick 2.4
    import QtQuick.Window 2.2
    
    Window {
        id: windowId
        visible: true
        width: 400
        height: 400
    
        Repeater {
            id: rainDropId
            model: 200
    
            delegate: Rectangle {
                width:5
                height:5
                color: "#3399FF"
                radius: width*0.5
            }
        }
    
        Timer {
            running: true
            interval: 1000
            repeat: true
            triggeredOnStart: true
            onTriggered: {
                for (var i = 0; i < rainDropId.count; ++i) {
                    rainDropId.itemAt(i).x = Math.floor(Math.random() * windowId.width);
                    rainDropId.itemAt(i).y = Math.floor(Math.random() * windowId.height);
                }
            }
        }
    }
    

    You might also consider using Qt Quick Particles to create rain drops.