2016-11-14 7 views
0

、私はいくつかのQML Objectsを切り替えるためにStackViewを使用:QML:Qt5.7とStackView及びC++結合変数

item、すなわち obj1ある
StackView { 
    id: stack 
    anchors.fill: parent 
    initialItem: initObj 
} 

Component { 
    id: initObj 
    ModuleHome {} 
} 

Component { 
    id: obj1 
    Module1 {} 
} 

// ... 

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

。 これは動作し、トランジションのアニメーションを簡単に追加できます。

問題はオブジェクトの内側です。 それらのいくつか私はUIを更新するために使用することをC++に結合するいくつかの変数、すなわちあります:StackViewに移行する前に

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

をすべての私のオブジェクトが起動時に作成され、彼らは「生きている」だったので、彼らはありましたitemSizeの変更を聞きます。 これは表示されているときだけ聞くので、変更が既に発生している可能性がある(つまり、起動時に設定ファイルから読み込む)ために必要な「何か」をしません。

1つの解決策は、Component.onCompletedイベントのC++メソッドを呼び出して、varsの最終更新を要求することです。それは動作しますが、バインドされたvarsの利点を失います。

他にもスマートな方法はありますか?私。コンポーネントロード時のバインドされた変数の更新を自動的に強制します。

+0

'Component.onCompleted'イベントの中のvarsの値を設定すると、そのトリックを行うようです。 – Mark

答えて

1

ほとんどの場合、Component.onCompleted -eventは必要ありません。 必要な場合は、StackViewを使用していないときは、すでに必要と思われる可能性があります。

なぜですか?確率は高いので、シグナルハンドリングではなく、バインディングを使用する方法でコードをリファクタリングする可能性があります。
もちろん、これはどのような場合でも可能ではないかもしれませんが、(証拠なしで)Component.onCompletedのイベントをリファクタリングする必要がない場合の99%の数を推測します。

あなたは(-signal Component.onCompleted含む)の変数を設定する信号ハンドラを使用する場合、それはあなたが回避しよう可能性がある、非宣言より多くなる傾向があります。あなたは、さらに問題につながる可能性があるQt.binding(function() {return value})を使用しない限り、このようなComponent.onCompletedなどのイベント・ハンドラでプロパティを設定する

は、通常、(結合しない。あなたは-signal valueChangedに反応する必要がある場合

代わりに、トリガーを検討しますこの手動Component.onCompletedで、むしろによる忘れバインディングにエラーを回避するために、そこに値を初期化するよりも

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

しかし、再び:あなたは試してみてください最初に薄いが、でイベント処理を置き換えることによって、問題を解決することです結合(条件式)を直接値に設定します。

+0

これは理にかなっています!私のコードをもっと深く見れば、変数がまだ初期化されていないときにバインディングを利用するのが間違いだと思います。したがって、私が最初に設定したときに、 'valueChanged'シグナルが発生します。代わりに、私は実際の価値に頼り、UIを更新するためにその信号を使用する必要があります。 – Mark