2014-12-05 31 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數據表示..