QT -- 自定义控件 事件分发器/过滤器

自定义控件

自定义label:新建控件label 右键提升为

QT -- 自定义控件 事件分发器/过滤器_第1张图片

QT -- 自定义控件 事件分发器/过滤器_第2张图片

QT -- 自定义控件 事件分发器/过滤器_第3张图片

//.h
#ifndef CUSTOMLABEL_H
#define CUSTOMLABEL_H

#include 
#include 

class customLabel : public QLabel
{
    Q_OBJECT
public:
    explicit customLabel(QWidget *parent = nullptr);

signals:

public slots:
};

#endif // CUSTOMLABEL_H


//.cpp
#include "customlabel.h"

customLabel::customLabel(QWidget *parent) : QLabel(parent)
{

}

事件分发器:用于事件的分发,可以进行事件拦截的操作。事件分发器返回布尔类型:bool event(QEvent ev),如果返回值为true,代表用户自己处理该事件,否者交给基类实现事件。使用步骤:重写event事件

事件过滤器:可以在程序分发到event事件之前再做一次高级拦截。事件分发器返回布尔类型:bool eventfilter(QObjectobj,QEvent ev),如果返回值为true,代表用户自己处理该事件,否者交给基类实现事件。使用两个步骤:1.给控件安装事件过滤器;2.重写eventfilter事件。

QT -- 自定义控件 事件分发器/过滤器_第4张图片

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    //(1)通过事件分发器,拦截鼠标事件
    bool event(QEvent *ev);

    //重写事件过滤器
    bool eventFilter(QObject *,QEvent *);


private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 
#include 
#include 

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //步骤o1:安装事件过滤器
    this->installEventFilter(this);
    //步骤02:重写事件过滤器
}

MainWindow::~MainWindow()
{
    delete ui;
}

//(1)通过事件分发器,拦截鼠标事件
bool MainWindow::event(QEvent *e )
{
    //如果鼠标点击,在event事件分发器中,执行拦截操作
    if(e->type()==QEvent::MouseButtonPress)
    {
        //类型装换
        QMouseEvent *ev=static_cast(e);
        QString str=QString("拦截了鼠标点击了事件");
        qDebug()<lab_test)
    {
        if(ev->type()==QEvent::MouseButtonPress)
        {
            //类型装换
            QMouseEvent *ev=static_cast(ev);
            QString str=QString("事件过滤器拦截了鼠标点击");
            qDebug()<

你可能感兴趣的:(qt)