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函数了