我们先在ui中创建两个label
然后再mywidget.h中:
protected:
bool eventFilter(QObject *watched, QEvent *event);
然后在.cpp中
#include "mywidget.h"
#include "ui_mywidget.h"
#include<QEvent>
#include<QMouseEvent>
myWidget::myWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::myWidget)
{
ui->setupUi(this);
ui->label_2->installEventFilter(this);//安装过滤器
ui->label_2->setMouseTracking(true);//这是为了让鼠标一进入界面就运行,不然要一直按着鼠标
//才有作用
}
bool myWidget::eventFilter(QObject *watched, QEvent *event)
{
//如果过滤的地方是label_2
if(watched==ui->label_2)
{
QMouseEvent *eve=static_cast<QMouseEvent *>(event);//强制转换事件
//判定事件
//如果是鼠标按下的话,我们这里是显示出鼠标的移动的位置
if(event->type()==QEvent::MouseMove)
{
QString text=QString("Mouse move(%1,%2)").arg(eve->x()).arg(eve->y());
ui->label_2->setText(text);
return true;//事件停止
}
else
{
return QWidget::eventFilter(watched,event);//返回到myWidget的上一级QWidget
}
}
else
{
return QWidget::eventFilter(watched,event);//返回到myWidget的上一级QWidget
}
}
myWidget::~myWidget()
{
delete ui;
}
效果:
请注意,如果我们在一个部件安装了事件过滤器,一般在其父控件上实现事件过滤器函数。