Qt 开发中触发鼠标悬停事件
(1)setAttribute( Qt::WA_Hover,true)
//在构造函数中
ui->btnGetRadarPara->setAttribute(Qt::WA_Hover, true); //开启悬停事件
ui->btnGetRadarPara->installEventFilter(this); //安装事件过滤器
可以通过setAttribute( Qt::WA_Hover,true)
这样的一种方式来设置悬停事件
ui->btnGetTargetInfo->setAttribute(Qt::WA_Hover, true); //开启悬停事件
ui->btnGetTargetInfo->installEventFilter(this); //安装事件过滤器
protected:
bool eventFilter(QObject * obj, QEvent * event);
bool RadarExternalPlatForm::eventFilter(QObject * obj, QEvent * event)
{
if(obj == ui->btnGetRadarPara)
{
if(event->type() == QEvent::HoverEnter) //当鼠标悬停在获取雷达参数按钮上
{
m_pRadarLoader->SendGetCurRadarParamtersReqMsg(ui->editPlatFromID->text().toInt()); //获取雷达参数
return true;
}
}
if(obj == ui->btnGetTargetInfo)
{
if(event->type() == QEvent::HoverEnter) //当鼠标悬停在获取雷达参数按钮上
{
m_pRadarLoader->SendGetRadarDetectTargetInfo(ui->editPlatFromID->text().toInt()); //获取雷达参数
return true;
}
}
return QDialog::eventFilter(obj, event);
}
(2)setMouseTracking(true) 设置鼠标跟踪
1、要想实现mouseMoveEvent
,则需要在构造函数中添加setMouseTrack(true),直接得到监听事件。若是setMouseTrack(false),只有鼠标按下才会有mouseMove监听事件响应。
2、使用setMouseTracking(true)
对鼠标进行监控(mouseMoveEvent(QMouseEvent event)),如果WidgetA有个子窗体WidgetB会占据WidgetA的绝大部分空间,那么当鼠标移动到WidgetB上时,WidgetA就会失去对鼠标的监控。
3、使用setAttribute( Qt::WA_Hover,true)
也可以实现对鼠标的监控,相对于setMouseTracking(true)
来说,它可以弥补鼠标事件被子窗体获取的问题:
bool Widget::event(QEvent *e)
{
if (e->type() == QEvent::HoverEnter || e->type() == QEvent::HoverLeave
|| e->type() == QEvent::HoverMove)
{
QHoverEvent* pHoverEvent = static_cast<QHoverEvent *>(e);
setMouseStatus(pHoverEvent->pos());
}
return QWidget::event(e);
}