2014-12-05 146 views
1

在更新期间是否可以自动提高var/variant/object /(等)变量的通知方法?QML词典(jsobject,var)子属性通知

假设我有:

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

接下来,我已经绑定的,例如,文本:

Text { 
    text: objects.obj1 

    onTextChanged: objects.obj1 = text 
} 

onTextChanged我想提出objects变量的通知信号处处更新。

+0

你应该有你每次换JS对象的属性值时发出的信号。并确保它永远不会改变。你可能会考虑使用一个访问器函数。否则它将无法工作,您需要'QObject'派生的类来获取信号,因此值更改通知才能工作。 – dtech 2014-12-05 22:47:42

+0

@ddriver我该如何实现? – 2014-12-05 22:52:25

回答

1

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

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

您可以强制发出objectsChanged(),方法是重新指定objects属性的新对象,其中包含obj1的新值和obj2的旧值,这将强制第二个文本元素更新并显示新值。它并不完美,但如果你真的需要使用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数据表示..