是否可以在更新过程中自动提高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友好的数据表示。