??代码资源:https://download.csdn.net/download/qq_36926037/85052673
16.1 项目准备
?? (1)创建项目,详细过程步骤:https://blog.csdn.net/qq_36926037/article/details/123720720 ??(2)创建自定义控件     ??(3)修改自定义控件的基类为QLabel类   ??(4)鼠标事件声明
#ifndef MYLABEL2_H
#define MYLABEL2_H
#include <QLabel>
class myLabel2 : public QLabel
{
Q_OBJECT
public:
explicit myLabel2(QWidget *parent = nullptr);
void enterEvent(QEvent *ev);
void leaveEvent(QEvent *ev);
void mousePressEvent(QMouseEvent *ev) ;
signals:
};
#endif

??(5)鼠标事件的实现
#include "mylabel2.h"
#include <QDebug>
myLabel2::myLabel2(QWidget *parent) : QLabel(parent)
{
}
void myLabel2:: enterEvent(QEvent *ev)
{
qDebug()<<"鼠标进入自定义控件";
}
void myLabel2::leaveEvent(QEvent *ev)
{
qDebug()<<"鼠标离开自定义控件";
}
void myLabel2::mousePressEvent(QMouseEvent *ev)
{
qDebug()<<"鼠标按下";
}

??(6)自定义控件的使用,包含事件 

 
16.2 事件分发器
??*事件分发器:用于事件的分发,可以进行事件拦截的操作。事件分发器返回布尔类型:bool event(QEvent ev),如果返回值为true,代表用户自己处理该事件,否者交给基类实现事件。使用步骤:重写event事件 
??(1)事件分发器声明
#ifndef MYLABEL2_H
#define MYLABEL2_H
#include <QLabel>
class myLabel2 : public QLabel
{
Q_OBJECT
public:
explicit myLabel2(QWidget *parent = nullptr);
void enterEvent(QEvent *ev);
void leaveEvent(QEvent *ev);
void mousePressEvent(QMouseEvent *ev) ;
bool event(QEvent *ev);
signals:
};
#endif

??(2)事件分发器实现
#include "mylabel2.h"
#include <QDebug>
#include <QEvent>
#include <QMouseEvent>
myLabel2::myLabel2(QWidget *parent) : QLabel(parent)
{
}
void myLabel2:: enterEvent(QEvent *ev)
{
qDebug()<<"鼠标进入自定义控件";
}
void myLabel2::leaveEvent(QEvent *ev)
{
qDebug()<<"鼠标离开自定义控件";
}
void myLabel2::mousePressEvent(QMouseEvent *ev)
{
qDebug()<<"鼠标按下";
}
bool myLabel2::event(QEvent *e )
{
if(e->type()==QEvent::MouseButtonPress)
{
QMouseEvent *ev=static_cast<QMouseEvent *>(e);
QString str=QString("拦截了鼠标点击了事件");
qDebug()<<str;
return true;
}
return QLabel::event(e);
}

16.3 事件过滤器
??事件过滤器:可以在程序分发到event事件之前再做一次高级拦截。事件分发器返回布尔类型:bool eventfilter(QObject*obj,QEvent *ev),如果返回值为true,代表用户自己处理该事件,否者交给基类实现事件。使用两个步骤:1.给控件安装事件过滤器;2.重写eventfilter事件。 
16.3.1 安装事件过滤器
??(1)添加label控件  ??(2)安装事件过滤器
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
ui->label_2->installEventFilter(this);
}
Widget::~Widget()
{
delete ui;
}

16.3.2 重写事件过滤器
??(1)事件过滤器声明
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
bool eventFilter(QObject *,QEvent *);
private:
Ui::Widget *ui;
};
#endif

??(2)事件过滤器实现
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QMouseEvent>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
ui->label_2->installEventFilter(this);
}
Widget::~Widget()
{
delete ui;
}
bool Widget::eventFilter(QObject *obj,QEvent *ev)
{
if (obj==ui->label_2)
{
if(ev->type()==QEvent::MouseButtonPress)
{
QMouseEvent *ev=static_cast<QMouseEvent *>(ev);
QString str=QString("事件过滤器拦截了鼠标点击");
qDebug()<<str;
return true;
}
}
return QWidget::eventFilter(obj,ev);
}
 ?? ?? ?? ?? ?? ?? ?? ?? ??
|