解决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(e);
        qDebug() << hoverEvent->pos();//打印鼠标在 本widget中的位置
    }

    return QWidget::event(e);
}

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

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

你可能感兴趣的:(QT,qt,鼠标移动,QHoverEvent,QMouseEvent,mouseMoveEvent)