How to access the properties of a Repeater's children in QML?

Can you tell me for below code that is there any way to change the imgx element properties. I have to change imgx.x value using javascript. Or is there any other way? I search qt docs but not helpfull. Thanks.

Row {
    Repeater {
        id:mmm
        model : 10
        Rectangle{
            clip: true
            width: 54
            height: 80
            color:"transparent"
            Image {
                id:imgx
                //x:-160
                //x:-105
                //x:-50
                x:0
                source: "images/tarama_lights.png"
            }
        }
    }
}

Answers


You have to add a property to the direct child of the Repeater (Rectangle in your case) and set it as a target for the property in the internal child (Image in your case). You can then use mmm.itemAt(<index of the element>).<property> = value. Code:

Repeater {
  id:mmm
  model : 10
  Rectangle{
    clip: true
    width: 54
    height: 80
    color:"transparent"
    property int imageX: 0 //adding property here

    Image {
      id:imgx
      x: parent.imageX //setting property as the target
      source: "images/tarama_lights.png"
    }
  }
}

You can then change the property like this:

onPropertyChange: {
  mmm.itemAt(index).imageX = newValue //the index defines which rectangle you change
}

JuliusG's answer is right in using itemAt. But it is not required to set it as a target for the property in the internal child (Image in your case). You can have your code as it is and instead of

onPropertyChange: {  mmm.itemAt(index).imageX = newValue //the index defines which rectangle you change }

use this:

onPropertyChange: {  mmm.itemAt(index).children[0].x = newValue //the index defines which rectangle you change }

Hope it helps.


Need Your Help

C++ Shared Library with Templates: Undefined symbols error

c++ templates gcc class linker

I'm trying to link to a shared library with a template class, but it is giving me "undefined symbols" errors. I've condensed the problem to about 20 lines of code.