QML (少なくともバージョン 5.6 1まで) では、JavaScript コンテキストで新しい値が割り当てられると、プロパティ バインディングが壊れます。
Item {
property bool sourceBool: <some changing value e.g. from C++ code>
property bool boundBool: sourceBool
function reassignBool() {
boundBool = true;
}
}
一度reassignBool
呼び出されると、boundBool
のtrue
状態に関係なく になりますsourceBool
。
元のバインディングを壊さない一時的な値をプロパティに割り当てられるようにしたいと考えています。NOTIFY
一時的な値は、元のバインディングに関連付けられたシグナルのいずれかがトリガーされるまで持続し、その時点で、バインドされたプロパティはバインディングによって計算された値を再び反映します。
ユースケースの例として、ユーザーが 2 回続けて押すことができないようにしたいボタンがあり、いくつかのルールに従って有効または無効になっているとします。
MyButton {
id: onceOnlyButton
// Suppose the QML type `MyButton` provides a boolean property
// called `enabled` that greys out the button and prevents it from
// being clicked when `false`.
enabled: <condition1> && <scondition2>
onClicked: {
<schedule some asynchronous work>
}
}
<condition1>
ボタンがクリックされたときにが最終的に になると仮定すると、false
ボタンは最終的に適切に無効になりますが、すぐには無効になりません。
だから私は次のようなことをしたいと思います:
....
onClicked: {
enabled = false
<schedule some asynchronous work>
enabled = Qt.binding(function() {
return <condition1> && <condition2>
}
}
...しかし、もちろん、バインディングを再確立するとすぐに、まだになっcondition1
ていないので、再びなります.false
enabled
true
に関連付けられたシグナルを、 を呼び出すハンドラにConnections
接続する何らかのオブジェクトを作成して、オブジェクトを削除できると思います。しかし、これはかなり複雑で洗練されていないように思えます。NOTIFY
<condition1>
Qt.binding
Connections
enabled
がに設定されていることを確認する方法はありますfalse
immediately 、その後、それらの信号のいずれかが発行されるとすぐに、NOTIFY
信号に再バインドされますか?<condition1>
<condition2>
1割り当てが 5.7 のバインディングにどのように影響するかは完全にはわかりませんが、プロパティに値を割り当ててもバインディングが自動的に壊れないことはわかっています。したがって、これは 5.7 ですぐに使用できるように自動的に機能する可能性があります。