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



是否可以在更新过程中自动提高var/variant/object/(等(变量的通知方法?

假设我有:

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

接下来,我绑定了例如文本:

Text {
    text: objects.obj1
    onTextChanged: objects.obj1 = text
}

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

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

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

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

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 属性,每次更改时,它都会将更改的内容写入objects,而不会像第一个解决方案中那样重新分配整个对象。

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

最新更新