QML InputHandler остановить распространение события

У меня есть два прямоугольника, каждый с TapHandler. Прямоугольник A является родителем прямоугольника B
Как мне настроить A и B, чтобы при щелчке B EventPoint не передавался обработчику onSingleTapped A?

В документах EventPoint предлагается установить для его свойства accepted значение true:

Принято значение true предотвращает распространение события на Items ниже Item PointerHandler.

Однако в то же время в документации указано, что accepted является свойством только для чтения, что не имеет особого смысла (я предполагаю, что документация устарела или просто неверна).

TestCode:

Rectangle {
    id: a

    width: 200
    height: 200
    color: "yellow"
    TapHandler {
        onSingleTapped: console.log("A tapped")
    }

    Rectangle {
        id: b
        color: "blue"
        width: 100
        height: 100
        TapHandler {
            onSingleTapped: function(eventPoint) {
                // Stop propagation.
                eventPoint.accepted = true
                console.log("B tapped")
            }
        }
    }
}

ОБНОВЛЕНИЕ: установка gesturePolicy of B на TapHandler.ReleaseWithinBounds предотвращает получение события A. Не уверен, действительно ли это лучшее решение


person skaldesh    schedule 27.12.2020    source источник


Ответы (1)


Для обработчиков весь event доставляется каждому обработчику; поэтому Обработчики принимают отдельные points, а не целые event. Как правило, принятие всех баллов подразумевает принятие всего события, но может оказаться, что один обработчик принимает одни баллы, а другой - другие баллы. доставка не завершается, пока все точки не будут accepted.

Похоже, что установка grabPermissions без gesturePolicy не дает ожидаемых результатов ... захватить событие и предотвратить распространение на другие элементы.

Изменение Rectnagle b (дочернего элемента a) TapHandler на gesturePolicy: TapHandler.ReleaseWithinBounds TapHandler.WithinBounds кажется правильным способом для aaccept, другими словами, таким образом он принимает точку, а это означает, что событие не будет распространяться на TapHandler родительского Rectangle!

    Rectangle {
        id: b
        z:2
        color: "blue"
        width: 100
        height: 100
        TapHandler {
            gesturePolicy: TapHandler.ReleaseWithinBounds | TapHandler.WithinBounds
            grabPermissions: PointerHandler.CanTakeOverFromAnything | PointerHandler.CanTakeOverFromHandlersOfSameType | PointerHandler.CanTakeOverFromItems
                             | PointHandler.ApprovesTakeOverByAnything | PointHandler.ApprovesCancellation
            onSingleTapped: function(eventPoint) {
                // Stop propagation.
                eventPoint.accepted = true // this is just a confirmation!
                console.log("B tapped")
            }
        }
    }

дальше от .. narkive interset group < / а>

person Mohammad Kanan    schedule 28.12.2020
comment
Спасибо за подробный ответ. Я тоже это обнаружил (см. Мое обновление). Я пока приму твой ответ - person skaldesh; 28.12.2020