3

onPressed イベントを QML ツリー内の後続のオブジェクトにディスパッチしたい (mouse.accepted = false を指定し、propagateComposedEvents: true を指定した) が、onreleased イベントを最上位の要素で動作させたい..ここにコード:

Item {

    width: 200
    height: 200

Rectangle {
    z: 1
    anchors.fill: parent
    MouseArea{
        anchors.fill: parent
        propagateComposedEvents: true
        onPressed: {
            console.log("R1 pressed")
            mouse.accepted = false
        }
        onReleased: {
            console.log("R1 released")
            mouse.accepted = false
        }
    }
}

Rectangle {
    z: 0
    anchors.fill: parent
    MouseArea{
        anchors.fill: parent
        propagateComposedEvents: true
        onPressed: {
            console.log("R2 pressed")
        }
        onReleased: {
            console.log("R2 released")
        }
    }
}

}

私が期待するもの:

qml: R1 が押された qml: R2 が押された qml: R1 がリリースされた qml: R2 がリリースされた

私が得るもの:

qml: R1 が押された qml: R2 が押された qml: R2 が解放された

どうすれば解決できますか?

よろしくお願いいたします。

4

1 に答える 1

1

propagateComposedEventsの動作は構成されたイベントに対してのみ定義されているため、を使用しても機能しません。つまり、 clicked、 、doubleClickedおよびのいずれかpressAndHoldです。したがってmouse.accepted = false、R1 のonPressedハンドラーに設定すると、これは関係ありませんpropagateComposedEvents

設定mouse.accepted = falseは代わりに、ドキュメントに従って行うべきことを行います。

次にボタンが押されるまで、この MouseArea にそれ以上のイベントは送信されません。

私の意見では、最上位の MouseArea でのマウス入力にのみ反応するべきです。R1 と R2 が互いに完全に重なり合っている限り、R2 は単純にそうではないものになります。R1 が R2 よりも小さく、R1 のハンドラーで R2 に対して何かをしたい場合は、R2 コードを関数に移動して、両方の MouseAreas のイベント ハンドラーから呼び出すだけです。または、両方の Mousearea のpressed状態へのバインディングを使用するだけです。

于 2015-01-17T16:01:05.583 に答える