自定义控件
自定义label:新建控件label 右键晋升为
//.h#ifndef CUSTOMLABEL_H#define CUSTOMLABEL_H#include <QWidget>#include <QLabel>class customLabel : public QLabel{ Q_OBJECTpublic: 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_NAMESPACEnamespace Ui { class MainWindow; }QT_END_NAMESPACEclass MainWindow : public QMainWindow{ Q_OBJECTpublic: 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);}