5

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呼び出されると、boundBooltrue状態に関係なく になります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ていないので、再びなります.falseenabledtrue

に関連付けられたシグナルを、 を呼び出すハンドラにConnections接続する何らかのオブジェクトを作成して、オブジェクトを削除できると思います。しかし、これはかなり複雑で洗練されていないように思えます。NOTIFY<condition1>Qt.bindingConnections

enabledがに設定されていることを確認する方法はありますfalse immediately 、その後、それらの信号のいずれかが発行されるとすぐに、NOTIFY信号に再バインドされますか?<condition1><condition2>

1割り当てが 5.7 のバインディングにどのように影響するかは完全にはわかりませんが、プロパティに値を割り当ててもバインディングが自動的に壊れないことはわかっています。したがって、これは 5.7 ですぐに使用できるように自動的に機能する可能性があります。

4

1 に答える 1