一、事件分发器
事件分发器:用于事件的分发,可以进行事件拦截的操作。事件分发器返回布尔类型:bool event(QEvent ev),如果返回值为true,代表用户自己处理该事件,否者交给基类实现事件。使用步骤:重写event事件;
//事件过滤器 bool eventFilter(QObject *obj,QEvent *e);
//事件分发器 bool MyLabel::event(QEvent *e){ //如果鼠标按下,在event事件中做处理 if(e->type()==QEvent::MouseButtonPress){ QMouseEvent *ev=static_cast<QMouseEvent *>(e); QString str=QString("event鼠标按下x=%1 y=%2 globalX=%3 globalY=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY()); qDebug()<<str; //事件已处理,不向下分发 return true; } //向下分发 return QLabel::event(e); }
二、事件过滤器
事件过滤器:可以在程序分发到event事件之前再做一次高级拦截。事件分发器返回布尔类型:bool eventfilter(QObjectobj,QEvent ev),如果返回值为true,代表用户自己处理该事件,否者交给基类实现事件。使用两个步骤:1.给控件安装事件过滤器;2.重写eventfilter事件。
//给label 安装事件过滤器 ui->label->installEventFilter(this);
bool Widget::eventFilter(QObject *obj,QEvent *e){ if(obj==ui->label){ //如果鼠标按下,在event事件中做处理 if(e->type()==QEvent::MouseButtonPress){ QMouseEvent *ev=static_cast<QMouseEvent *>(e); QString str=QString("event鼠标按下x=%1 y=%2 globalX=%3 globalY=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY()); qDebug()<<str; //事件已处理,不向下分发 return true; } } return QWidget::eventFilter(obj,e); }