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 绑定到数组元素的主要内容,如果未能解决你的问题,请参考以下文章