2016-11-14 100 views
0

隨着Qt5.7,我使用了StackView中的幾個QML Objects切換:QML:StackView和C++約束變量

StackView { 
    id: stack 
    anchors.fill: parent 
    initialItem: initObj 
} 

Component { 
    id: initObj 
    ModuleHome {} 
} 

Component { 
    id: obj1 
    Module1 {} 
} 

// ... 

stack.push({item: item, replace: true, destroyOnPop: true}) 

其中item是即obj1。 它的作品,我可以很容易地添加一個動畫的過渡。

問題出在我的對象裏面。 他們中有些人勢必C++一些變量,我用它來更新UI,即:

property int itemSize: MyClass.itemSize 
onItemSizeChanged { 
    // do something 
} 

之前遷移到StackView在啓動時創建的所有我的對象,他們是「活的」,因此他們聽取itemSize的變化。 現在,只有當它們可見時纔會聽,所以它們不會做我需要的「某些東西」,因爲這些更改可能已經發生(即我在啓動時從設置文件中讀取)。

一個解決方案是調用Component.onCompleted事件中的C++方法來請求最後一次更新變量。它會起作用,但我會放棄限制變量的好處。

有沒有其他的智能方式?即自動強制更新組件負載上的綁定變量。

+0

設置'Component.onCompleted'事件中的變量值似乎有訣竅。 – Mark

回答

1

在大多數情況下,您不應該需要Component.onCompleted -event。 如果你需要它,當你沒有使用StackView時,你很可能已經需要它了。

爲什麼?因爲可能性很高,所以你可能會重構你的代碼,這是你使用綁定的方式,而不是信號處理。
當然,這在任何情況下都可能是不可能的,但是(沒有證據),我猜想99%的情況下,你不需要Component.onCompleted事件應該是可能的重構。

如果使用信號處理程序設置變量(包括Component.onCompleted - 信號),它會變得越來越非陳述,你可能會盡量避免。

設置屬性在事件處理程序,如Component.onCompleted通常不綁定(除非你使用Qt.binding(function() {return value})這可能會導致更多的問題。

相反,如果你需要一個valueChanged - 信號反應,考慮觸發這在手動Component.onCompleted,而不是初始化值出現,以避免差錯由於忘記綁定

Component.onCompleted: { 
    somePropertyChanged() 
    someOtherPropertyChanged() 
    ...... 
} 

但再次:你應該嘗試的第一薄,是通過更換事件處理解決問題綁定(conditionaly)直接指向值。

+0

這很有道理!深入研究我的代碼,我認爲錯誤的是在變量尚未初始化時利用綁定。因此,我第一次設置'valueChanged'信號被觸發。相反,我需要依靠他們的實際價值,並使用該信號來更新用戶界面。 – Mark