可以通过两种方式去拦截一个事件:1、事件分发器 2、事件过滤器。他们的流程如下:
1、通过事件分发器拦截:
首先明白分发器对应的函数是event,其返回值是bool类型,若是true则代表此事件由用户自己处理,不向下分发,同时不处理的事件就抛出给父类去解决。但其主要功能是分发,所以不推荐利用其进行事件的拦截。主要代码如下
//事件分发器 用途是分发事件 也可以拦截事件
bool MyLabel::event(QEvent *e)
{
if( e->type() == QEvent::MouseButtonPress )
{
//如果是鼠标按下 拦截事件 不向下分发
QMouseEvent *ev = static_cast<QMouseEvent *>(e);
QString str = QString("event事件中 鼠标按下了 x = %1 y = %2").arg(ev->x()).arg(ev->y());
qDebug()<<str;
return true;
}
//其他事件 抛给父类处理
return QLabel::event(e);
}
2、事件过滤器
利用事件过滤器可以做更高级的拦截,分为两个步骤,步骤一是给控件安装过滤器;步骤二是重写过滤器事件;此函数返回值也是bool,用法也和事件分发器相同。主要代码如下
//给label添加事件过滤器 做更高级的拦截操作
//1、给控件安装过滤器
ui->label->installEventFilter(this);
//2、重写过滤器
bool Widget::eventFilter(QObject *obj, QEvent *e)
{
if( obj == ui->label)
{
if( e->type() == QEvent::MouseButtonPress )
{
//如果是鼠标按下 拦截事件 不向下分发
QMouseEvent *ev = static_cast<QMouseEvent *>(e);
QString str = QString("通过事件过滤器 鼠标按下了 x = %1 y = %2").arg(ev->x()).arg(ev->y());
qDebug()<<str;
return true;
}
}
//其他事件 抛给父类
return QWidget::eventFilter(obj,e);
}