Qt 中 无法根据鼠标移动事件(mouseMoveEvent 无效)

一、setMouseTracking

在Qt中要捕捉鼠标移动事件需要重写 MouseMoveEvent,

但是 MouseMoveEvent 为了不太耗资源在默认状态下是要鼠标按下才能捕捉到

要想鼠标不按下时的移动也能捕捉到,需要

setMouseTracking(true)

这个属性保存的是窗口部件跟踪鼠标是否生效

1、如果鼠标跟踪失效(默认),当鼠标被移动的时候只有在至少一个鼠标按键被按下时,这个窗口部件才会接收鼠标移动事件

2、如果鼠标跟踪生效,如果没有按键被按下,这个窗口部件也会接收鼠标移动事件。

二、QMainWindow 特例

QWidget中使用是没有问题的,但是,对于 QMainWindow 即使使用了 setMouseTracking(true) 依然无法捕捉到鼠标没有按下的移动,只有在鼠标按下是才能捕捉。

解决办法:

要先把 QMainWindow 的 CentrolWidget 使用 setMouseTracking(true) 开启移动监视

然后再把 QMainWindow 的 setMouseTracking(true) 开启监视。之后就一切正常了。

原因:

CentrolWidget 是 QMainWindow 的子类,你如果在子类上响应鼠标事件,只会触发子类的 mouseMoveEvent,根据C++继承和重载的原理,所以子类也要 setMouseTracking(true);

所以如果你想响应鼠标事件的控件被某个父控件包含,则该控件及其父控件或容器也需要 setMouseTracking(true);

 

  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值