8
votes

I have a width property on a QML Rectangle that is set based on another Rectangle with an id of mainwindow and one of the array properties of mainwindow:

width: mainwindow.width/mainwindow.numColsPerRow[positionRow]

This works at the time my rectangle is setup; that is, the element inside the array numColsPerRow is correctly involved.

However, after this Rectangle is setup, if I change the values inside numColsPerRow the width of this Rectangle does not have any effect.

Does QML not allow property bindings to array elements?

1
I don't think you can bind to an array this way. More info here: qt-project.org/doc/qt-5.0/qtqml/… You should use a Model to store dynamic data that you want your items to bind to.koopajah
@koopajah that example is using variant however if you use your arrays as var instead, the notion that you cannot modify the array elements directly doesn't apply. variant is obsolete in favor of ordinary javascript var, though this still doesn't address the binding issue.johnbakers
> Yes I know but I did not find another documentation explaining that binding to array values did not work. I really think you should use a ListModel for thiskoopajah
@koopajah that's a good idea, thanksjohnbakers

1 Answers

17
votes

Values in a var JS array don't emit and 'changed' signal when you call :

my_array  [n] = value;

In order to get the array property notified to every code using it you must use this trick :

var tmp =  my_array;
tmp [n] = value; // you can do multiple changes, and also push/splice items
my_array = tmp;

This way, QML engine will emit the signal and other bindings using my_array will be notified and updated.

PS: you can't use a ListModel for this, because you won't have a way to get a particular item in the model using a key like array or map do. Models are meant to be used with a MVC view...