解决Qt graphis-view框架中,上层图元接收hover事件导致底层图元接收不到的问题

问题重现

两个图元,一个在上面,名为item_up,一个在下面,名为item_below。
当item_up->setAcceptHoverEvents(true)时,item_up可以接收到鼠标悬停事件(hoverEnter,hoverMove,hoverMove)。但是下层的item_below在重叠区域就接收不到悬停信号了。除非item_up->setAcceptHoverEvents(false),item_below才能在鼠标经过重叠区域时接收到悬停信号组。

问题分析

采用过各种方法,都不能很好地解决这个问题。于是最终考虑采用自定义事件的方法,自己实现。

解决方案

自定义三个事件,鼠标进入,鼠标移动,鼠标退出。
在画布的鼠标移动事件处理函数mouseMoveEvent中,将鼠标事件转换为图元的鼠标选题悬停事件,发送给当前鼠标下的所有图元,并结合判断acceptHoverEvents()来确定图元是否需要接收此事件,减少计算量。
在图元中的sceneEvent中响应三个信号。或者自定义一个图元基类,实现事件识别与处理函数分配,并定义三个虚函数,用于子类重新实现自定义事件响应。

note
使用event->ignore()不能解决重叠导致的事件传递中断问题。
点击事件即使在图元重叠的状态下也可以接收到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

撬动未来的支点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值