解决QT中QWidget无法触发mouseMoveEvent鼠标移动事件

mouseMoveEvent这个事件函数,只要鼠标在这个widget内移动,就会触发该事件。但是经常发现这个事件函数不被触发,怎么办?

1、最常见的一种问题,没有设置鼠标跟踪。

setMouseTracking(true);

或者设置窗口标志

setAttribute(Qt::WA_Hover,true);

需要注意的是,这个Qt::WA_Hover的CPU成本更高,本质上鼠标移动事件,就是被Qt::WA_Hover这个标志分发下去的,除此之外,Qt::WA_Hover还会分发更多事件,如鼠标进入、移出、移动等。

本文由【暴躁的野生猿】发表于CSDN,如果有非法转载,请帮忙举报,谢谢。百度搜索暴躁的野生猿《解决QT中QWidget无法触发mouseMoveEvent鼠标移动事件》可找到本文的原文。

2、设置了鼠标跟踪,依然不起作用

那是因为你的widget上有别的子控件,子控件覆盖的地方,鼠标移动事件会被分发到子控件,子控件会把事件拦截,然后父控件就无法收到鼠标移动事件了,这时父控件的mouseMoveEvent函数就不会被触发了。

这时的解决方案是,重写event事件函数:bool QWidget::event(QEvent *event)

这个函数里面,拥有所有的事件,而鼠标移动事件,可以这样判定:

bool MyWgt::event(QEvent *e)
{

    if(QEvent::HoverMove == e->type())//鼠标移动
    {
        QHoverEvent *hoverEvent = static_cast<QHoverEvent*>(e);
        qDebug() << hoverEvent->pos();//打印鼠标在 本widget中的位置
    }

    return QWidget::event(e);
}

注意:setAttribute(Qt::WA_Hover,true);这一行不可少。

上面这个函数可以完全替代mouseMoveEvent的功能,甚至鼠标在子控件上移动时,这个if也会被触发,所以你都不需要重载mouseMoveEvent函数了

  • 13
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值