微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

QML InputHandler 停止事件传播

如何解决QML InputHandler 停止事件传播

我有两个矩形,每个都有一个 TapHandler。矩形 A 是矩形 B 的父项
如何配置 A 和 B,以便在单击 B 时,EventPoint 不会传播到 A 的 onSingleTapped 处理程序?

EventPoint docs 建议将其 accepted 属性设置为 true:

将accepted 设置为true 可防止事件传播到PointerHandler 的项目下方的项目。

然而,同时文档声明 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")
            }
        }
    }
}

UPDATE:将 B 的 gesturePolicy 设置为 TapHandler.ReleaseWithinBounds 会阻止 A 接收事件。不确定这是否真的是最好的解决方

解决方法

对于Handlers,整个event被传递给每个handler;因此处理程序接受单个 points,而不是整个 event。一般来说,接受所有点意味着接受整个事件,但也可能是一个处理程序接受一些点而另一个接受其他点。直到所有点都 accepted 时才“完成”交付。

看起来没有 grabPermissions 的设置 gesturePolicy 没有达到预期的效果..抓住事件并防止传播到其他项目

Rectnagle b (a 的孩子) TapHandler 改为 gesturePolicy: TapHandler.ReleaseWithinBounds TapHandler.WithinBounds 似乎是 aaccept 的正确方法,换句话说,它接受了这一点,这意味着事件不会传播到父 Rectangle 的 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")
            }
        }
    }

更远于.. narkive interset group

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。