2013-10-23 41 views
7

我想創建一個具有onetwo兩個屬性的自定義QML組件,它在未初始化時應該具有默認值。特別是,如果two應取決於one的初始值。下面的代碼如何避免在QML中初始化時創建屬性綁定?

Rectangle { 
    property int one: 1 
    property int two: 2 * one 
} 

但創建一個屬性綁定:只要有one變化,two更新爲2 * one新值。如何在不創建綁定的情況下將two初始化爲的值2 * one

+4

你可以做的一種方法是在Component.onCompleted上手動初始化它,但這似乎不是理想的方式 – Kunal

回答

0

事實上,你不應該這樣做。綁定是QML的基本行爲,如果你試圖避免它,那是因爲你沒有想好的方式。

對於爲例,如果屬性兩個初始值計算與屬性的一個初始值但不屬性的一個值

然後要在初始值沒有值綁定意思,你應該創建一個只讀屬性其價值將是屬性的一個初始值

readonly property int initialOne : 1; 
property int one : initialOne; 
property int two : 2 * initialOne; 

這可能顯得有點沉重,但如果你仔細想想,初始值是什麼,你想使用,因此,該財產的概念是你真正想要的

+0

如果initialOne依賴於parent.width(例如)如readonly屬性int initialOne:parent.width? – Korchkidu

+0

如果我可以在某些情況下避免不必要的綁定,那麼爲什麼我應該有?在某些情況下,不需要約束。想象一下,創建一個具有明確或不可更改大小的應用程序(如移動設備上發生的情況)。在這種情況下,不需要綁定寬度或高度等。您可能需要立即更改屬性,並且稍後的值更改並不重要。想象一下使用'PropertyChanges'和值的變化。具有約束力和它的開銷嗎?! –

+0

@ S.M.Mousavi:不,你說得對,綁定並不總是必要的。但是,當您在計算上定義屬性基礎時,Qml屬性與變量不同。你正在定義這兩個屬性之間的關係。如果你想要一個屬性具有基於計算的價值,那麼以後不會改變,你不應該使用屬性,你應該使用變量 – BlueMagma

0

仔細檢查有不需要綁定,並小心不要弄髒代碼。
你可以很快填充值屬性,如下所示:

window { 
    id: win 
    width: 300; height: 450 
    color: "#d8d8d8" 
    Item { 
     property int val1 
     property int val2 
     property int val3: parent.width //<-- Binding 
     Component.onCompleted: { 
      val1 = win.width; //<---| 
      val2 = win.height; //<---|=== There is no binding. Just changes value 
      /* ... */ 
     } 
    } 
} 

(我不知道,你可以使用Component.onStatusChangedComponent.Ready狀態設定初始值)對於性能

注意:信號和Javascript代碼有一些性能影響。使用綁定可能會更高效。使用Profiler來檢查。如果你想設置多個屬性的初始值,或者你已經使用了onCompleted信號,那麼這將提高性能!

0

明確打破組件完成後綁定:

Rectangle { 
    property int one: 1 
    property int two: 2 * one 
    Component.onCompleted: two = two 
} 

two = two分配打破了結合和two不再更新one變化。