QML字典(jsobject,var)子属性通知

时间:2014-12-05 18:44:01

标签: qt binding qml notify

是否可以在更新期间自动提升var / variant / object /(等)变量的notify-method?

假设我有:

property var objects: {'obj1': 'unnamed', 'obj2': 'unnamed'}

接下来我有绑定,例如text:

Text {
    text: objects.obj1

    onTextChanged: objects.obj1 = text
}

onTextChanged我想提出objects变量的通知信号,以便在任何地方更新。

1 个答案:

答案 0 :(得分:1)

嗯,如果我没弄错的话,QML会为onObjectsChanged生成一个objects信号处理程序但是当你在内部更改objects时它不会被发出,并且由于QML的精彩设计,你不能手动发出objectsChanged(),它会自动发出,但它不会发出。它仅在将属性重新分配给另一个对象时才会发出。

您无法为JS对象创建信号,因为这需要QObject派生类来获取信号,从而获取通知和绑定。

您可以通过使用obj1的新值和obj2的旧值重新分配objectsChanged()属性新对象来强制发出objects,这将强制第二个文本元素更新并显示新的价值。它不是很优雅,但如果你真的需要使用JS对象,它是一个有效的解决方案。否则,您必须使用QtObject

obj1/2元素和QML属性
property var objects: {'obj1': 'unnamed', 'obj2': 'unnamed'}

Column {
    spacing: 30

    TextEdit {
        text: objects.obj1
        onTextChanged: {
            objects = {'obj1': text, 'obj2': objects.obj2}
        }
    }

    Text {
        text: objects.obj1
    }
}

另一种可能的解决方案是不依赖objects的通知,并使用代理属性作为控制器。

property var objects: {'obj1': 'unnamed', 'obj2': 'unnamed'}    
property string obj1: objects.obj1
onObj1Changed: objects.obj1 = obj1  

这样你根本不使用objects,除了将数据存储到其中之外,请改用obj1属性,每次更改它都会将更改写入{{ {1}}没有像第一个解决方案那样重新分配整个对象。

但除非你真的需要JS对象,否则我建议废弃它并使用更多QML友好的数据表示。