QML 绑定到数组元素

Posted

技术标签:

【中文标题】QML 绑定到数组元素【英文标题】:QML binding to an array element 【发布时间】:2013-10-25 07:05:42 【问题描述】:

我在 QML Rectangle 上有一个 width 属性,该属性是基于另一个 Rectangle 设置的,id 为 mainwindow,其中一个数组属性为 mainwindow

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

这在我的矩形设置时有效;也就是数组numColsPerRow里面的元素是正确涉及的。

但是,在设置了这个 Rectangle 之后,如果我改变了 numColsPerRow 里面的值,这个 Rectangle 的 width 没有任何效果。

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

【问题讨论】:

我认为您不能以这种方式绑定到数组。更多信息在这里:qt-project.org/doc/qt-5.0/qtqml/…你应该使用Model来存储你希望你的项目绑定到的动态数据。 @koopajah 该示例使用variant 但是,如果您将数组用作var,则不能直接修改数组元素的概念不适用。 variant 已经过时,取而代之的是普通的 javascript var,尽管这仍然不能解决绑定问题。 > 是的,我知道,但我没有找到其他说明绑定到数组值不起作用的文档。我真的认为你应该为此使用ListModel @koopajah 这是个好主意,谢谢 【参考方案1】:

当您调用时,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 视图一起使用...

【讨论】:

真正有趣的解决方法!奇迹般有效!谢谢!【参考方案2】:

@TheBootroo 的优秀解决方案的替代方案,它避免了多余的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: How to trigger onChanged in custom Component?

【讨论】:

以上是关于QML 绑定到数组元素的主要内容,如果未能解决你的问题,请参考以下文章

WPF 更新绑定到数组中的元素

WPF将单个文本框绑定到集合对象或数组中的元素

如何在 QML 中显示二维数组的值?

QML ListView:检测到属性“高度”的绑定循环

如何将 SwiftUI 视图绑定到数组中元素的属性

在 Qml 中从字节数组加载到图像