8

width在 QML 上有一个属性,该属性Rectangle是基于另一个 Rectangle 设置的,其 idmainwindow和数组属性之一mainwindow

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

这在我的矩形设置时有效;numColsPerRow即正确涉及数组内的元素。

但是,在设置此 Rectangle 之后,如果我更改此 Rectangle 内部numColsPerRow的值width,则不会产生任何影响。

QML 不允许属性绑定到数组元素吗?

4

2 回答 2

17

当您调用时,var JS 数组中的值不会发出和“更改”信号:

my_array  [n] = value;

为了让使用它的每个代码通知数组属性,您必须使用此技巧:

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

这样,QML 引擎将发出信号,并且使用 my_array 的其他绑定将得到通知和更新。

PS:您不能为此使用 ListModel,因为您无法使用数组或映射之类的键来获取模型中的特定项目。模型旨在与 MVC 视图一起使用...

于 2013-10-29T08:59:50.870 回答
0

@TheBootro 的好解决方案的替代方案,它避免了冗余tmp变量:结果你可以自己调用“更改”信号。

例如: mainwindow.numColsPerRowChanged()

无需使用emit,该技术可以在 QML 组件中使用。例如:

Item {
    id: root

    property int selectedSetting: 0
    property var selectedOptions: [1, 0, 3, 1]

    Keys.onPressed: {
        event.accepted = true
        switch (event.key) {
            case Qt.Key_Left:
                selectedOptions[selectedSetting] -= 1
                root.selectedOptionsChanged(); //force the signal so bound properties will pick up the change
                break;
            case Qt.Key_Right:
                selectedOptions[selectedSetting] += 1
                root.selectedOptionsChanged() //force the signal so bound properties will pick up the change
                break;
        }
    }
}

有关该技术的另一个应用,请参阅:QML:如何在自定义组件中触发 onChanged?

于 2022-01-13T03:35:37.503 回答