2012-08-10 85 views
3

我面臨着一個很大的問題,它需要花費很多時間才能修復,因爲我不知道原因以及如何解決該問題。該問題是非常簡單的:我有一個例子QML組件定義爲:QML雙向C++綁定不再收到更改

Rectangle { 
    id: rect 
    property bool test: myclass.testproperty 

    Rectangle { 
     width: 50 
     height: 50 
     visible: parent.test 
    } 
} 

和我連接的鼠標區域onClicked信號做到這一點:

test = !test 

所以我切換布爾變量的值。爲推動從C++價值QML和QML到C++ Q_PROPERTY具有讀,寫和NOTIFY信號,我使用,直到我點擊鼠標區域,所以我通過結合推動改變這種

Binding { 
    target: myclass 
    property: "testproperty" 
    value: rect.test 
} 

一切工作正常。之後,每次我嘗試從C++設置新的屬性值時,我都看不到QML中的任何更改,就像綁定被破壞一樣。但是,如果我嘗試點擊MouseArea,我仍然調用C++類的setTestProperty方法。基本上,它不同步C++ - > QML方式。爲什麼?我無法找到問題,信號被髮射,因爲QSignalSpy給了我1作爲發射次數計使用

emit this->testPropertyChanged(newvalue) 

編輯

這裏的例子之後:基本上在這裏我們使用的QString財產與相同的確切信號。唯一改變的事情是,而是採用了矩形QML元素,結合到自己的財產,我使用一個TextInput元素

TextInput { 
    id: mytext 
    text: myclass.testproperty 
} 

Binding { 
    target: myclass 
    property: "testproperty" 
    value: mytext.text 
} 

回答

6

這裏沒有問題。這是一種標準的QML綁定行爲。當您使用JavaScript代碼更改某些QML Widget的屬性時,將終止對它的所有聲明性綁定。您可以選擇在事件處理程序的JS代碼中手動使用聲明性綁定或更新值。

編輯

Rectangle { 
    id: rect 

    // Establishing initial value for 'test' property via QML binding 
    property bool test: myclass.testproperty 

    // Manual update of 'test' property when binding will be broken 
    Connections { 
     target: myclass 
     onTestpropertyChanged: { 
      rect.test = xxx 
     } 
    } 
} 
+0

如果我用的是同樣的事情,但與文本組件和相關文件的屬性它的工作原理。爲什麼? – Stefano 2012-08-11 10:37:00

+0

我不知道,爲什麼雙向綁定與Text對象一起工作。你能舉個例子嗎? – 2012-08-11 15:48:29

+0

增加了一個非常小的例子 – Stefano 2012-08-11 16:02:38