QML InputHandler 停止传播事件
QML InputHandler stop propagation of event
我有两个矩形,每个矩形都有一个 TapHandler
。矩形 A 是矩形 B 的父级
如何配置 A 和 B,以便在单击 B 时,EventPoint
不会传播到 A 的 onSingleTapped
处理程序?
EventPoint docs 建议将其 accepted
属性 设置为 true:
Setting accepted to true prevents the event from being propagated to Items below the PointerHandler's Item.
然而,与此同时,文档声明 accepted
是只读的 属性,这没有多大意义(我猜文档已经过时或者只是错误)。
测试代码:
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")
}
}
}
}
更新:将 B 的 gesturePolicy
设置为 TapHandler.ReleaseWithinBounds
可防止 A 接收事件。不确定这是否真的是最好的解决方案
对于Handlers,整个event
交付给每个handler;因此 Handlers 接受个人 points
,而不是整个 event
。一般来说,接受所有点意味着接受整个事件,但也可能是一个处理程序接受一些点而另一个处理程序接受其他点。直到所有点都达到 accepted
.
才算“完成”交付
看起来设置 grabPermissions
没有 gesturePolicy
并没有达到预期的效果.. 抓住事件并防止传播到其他项目.
将 Rectnagle
b (a's child) TapHandler
更改为 gesturePolicy: TapHandler.ReleaseWithinBounds TapHandler.WithinBounds
似乎是 aaccept
的正确方法,换句话说,它接受这种方式重点,这意味着事件不会传播到 parent 矩形的 TapHandler!
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")
}
}
}
我有两个矩形,每个矩形都有一个 TapHandler
。矩形 A 是矩形 B 的父级
如何配置 A 和 B,以便在单击 B 时,EventPoint
不会传播到 A 的 onSingleTapped
处理程序?
EventPoint docs 建议将其 accepted
属性 设置为 true:
Setting accepted to true prevents the event from being propagated to Items below the PointerHandler's Item.
然而,与此同时,文档声明 accepted
是只读的 属性,这没有多大意义(我猜文档已经过时或者只是错误)。
测试代码:
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")
}
}
}
}
更新:将 B 的 gesturePolicy
设置为 TapHandler.ReleaseWithinBounds
可防止 A 接收事件。不确定这是否真的是最好的解决方案
对于Handlers,整个event
交付给每个handler;因此 Handlers 接受个人 points
,而不是整个 event
。一般来说,接受所有点意味着接受整个事件,但也可能是一个处理程序接受一些点而另一个处理程序接受其他点。直到所有点都达到 accepted
.
看起来设置 grabPermissions
没有 gesturePolicy
并没有达到预期的效果.. 抓住事件并防止传播到其他项目.
将 Rectnagle
b (a's child) TapHandler
更改为 gesturePolicy: TapHandler.ReleaseWithinBounds TapHandler.WithinBounds
似乎是 aaccept
的正确方法,换句话说,它接受这种方式重点,这意味着事件不会传播到 parent 矩形的 TapHandler!
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")
}
}
}