乐趣区

关于qt:QT-自定义控件-事件分发器过滤器

自定义控件

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

//.h
#ifndef CUSTOMLABEL_H
#define CUSTOMLABEL_H

#include <QWidget>
#include <QLabel>

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 事件。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

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 <QDebug>
#include <QEvent>
#include <QMouseEvent>

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<QMouseEvent *>(e);
        QString str=QString("拦挡了鼠标点击了事件");
        qDebug()<<str;
        return true;//true 代表用户自主处理事件,不想下散发事件
    }
    // 其余事件,交给父类解决
    return QMainWindow::event(e);
}

// 事件过滤器实现
bool MainWindow::eventFilter(QObject *obj,QEvent *ev)
{if (obj==ui->lab_test)
    {if(ev->type()==QEvent::MouseButtonPress)
        {
            // 类型装换
            QMouseEvent *ev=static_cast<QMouseEvent *>(ev);
            QString str=QString("事件过滤器拦挡了鼠标点击");
            qDebug()<<str;
            return true;//true 代表用户自主处理事件,不想下散发事件
        }
    }
    return QWidget::eventFilter(obj,ev);
}
退出移动版