genius
事件分发器:用于事件的分发,可以进行事件拦截的操作。事件分发器返回布尔类型:bool event(QEvent ev),如果返回值为true,代表用户自己处理该事件,否者交给基类实现事件。
下方图可以看出当事件发生时需要有一个事件分发器来管理这个事件的处理走向
在qt助手中可以看到有很多事件,其中红色框的是鼠标事件
下面我们利用事件分发器实现对鼠标点击事件的拦截,废话不多说,上代码
myLabel.h:
#ifndef MYLABEL_H
#define MYLABEL_H
#include <QLabel>
class myLabel : public QLabel
{
Q_OBJECT
public:
explicit myLabel(QWidget *parent = nullptr);
//鼠标进入事件
void enterEvent(QEnterEvent *) ;
//鼠标离开事件
void leaveEvent(QEvent *);
//鼠标点击事件
virtual void mousePressEvent(QMouseEvent *ev);
//鼠标松开事件
virtual void mouseReleaseEvent(QMouseEvent *ev);
//鼠标移动事件
virtual void mouseMoveEvent(QMouseEvent *ev);
//事件分发
bool event(QEvent *e);
signals:
};
#endif // MYLABEL_H
myLabel..cpp:
#include "mylabel.h"
#include<QDebug>
#include<QMouseEvent>
myLabel::myLabel(QWidget *parent)
: QLabel{parent}
{
//设置鼠标追踪:不用点击才打印坐标
setMouseTracking(true);
}
//鼠标进入事件
void myLabel::enterEvent(QEnterEvent *) {
qDebug()<<"鼠标进来了";
}
//鼠标离开事件
void myLabel::leaveEvent(QEvent *){
qDebug()<<"鼠标出去了";
}
//鼠标点击事件
void myLabel::mousePressEvent(QMouseEvent *ev){
//qDebug()<<"鼠标按下了";
//只反馈左键
if(ev->button() == Qt::LeftButton){
//格式化字符串
QString str = QString("鼠标按下了 x = %1 , y = %2 , globalX = %3 , globalY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug()<<str;
}
}
//鼠标松开事件
void myLabel::mouseReleaseEvent(QMouseEvent *ev){
//qDebug()<<"鼠标松开了";
//只反馈左键
if(ev->button() == Qt::LeftButton){
//格式化字符串
QString str = QString("鼠标松开了 x = %1 , y = %2 , globalX = %3 , globalY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug()<<str;
}
}
//鼠标移动事件
void myLabel::mouseMoveEvent(QMouseEvent *ev){
//qDebug()<<"鼠标按下并移动了";
//只反馈左键
if(ev->buttons() & Qt::LeftButton){
//格式化字符串
QString str = QString(" x = %1 , y = %2 , globalX = %3 , globalY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug()<<str;
}
}
//事件分发实现
bool myLabel::event(QEvent *e){
//如果是鼠标按下了,在event事件分发器中做拦截操作
if(e->type() == QEvent::MouseButtonPress){
QMouseEvent *ev = static_cast<QMouseEvent *>(e);//将e强制转换成QMouseEvent类型
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);
}
下图红框标记表示拦截成功