其存在的意义:
mywidget.h:
#ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> namespace Ui { class MyWidget; } class MyWidget : public QWidget { Q_OBJECT public: explicit MyWidget(QWidget *parent = 0); ~MyWidget(); protected: bool event(QEvent *event); void timerEvent(QTimerEvent *event); //事件过滤器 bool eventFilter(QObject *obj, QEvent *e); private: Ui::MyWidget *ui; }; #endif // MYWIDGET_H
mywidget.cpp:
#include "mywidget.h" #include "ui_mywidget.h" #include <QEvent> #include<QTimerEvent> MyWidget::MyWidget(QWidget *parent) : QWidget(parent), ui(new Ui::MyWidget) { ui->setupUi(this); //安装过滤器 ui->label->installEventFilter(this); } MyWidget::~MyWidget() { delete ui; } void MyWidget::timerEvent(QTimerEvent *event) { } /* * */ bool MyWidget::event(QEvent *event) { //事件分发 // switch(event->type()) // { // case QEvent::Close: // closeEvent(); // break; // case QEvent::MouseMove: // mouseMoveEvent(); // break; // /* // * ...... // */ // } //关闭定时器 if (event->type() == QEvent::Timer) { //干掉定时器 //如果返回true,事件停止传播 //在传参数的时候注意类型是否能够匹配,如这里,定时器事件的参数类型是QTimerEvent *evevt, 而这里的类型是QEvent *event //故需要进行参数类型的转换 // QTimerEvent *ev= static_cast<QTimerEvent *event>(e); // timerEvent(ev); return true; } else { //为了保证其他的事件能够继续的执行,在这里添加return QWidget::event(e); //能够继续按照原来基类的方式进行处理(传播)。 //如果不添加这句话,其他事件不会起反应。 return QWidget::event(e); } } bool MyWidget::eventFilter(QObject *obj, QEvent *e) { if (obj == ui->label) { QMouseEvent *env = static_cast<QMouseEvent *>(e); //判断事件 if (e->type() == QEvent::MouseMove) { ui->label->setText(QString("mouse move(%1,%2)").arg(env->x()).arg(env->y())); return true ;//防止事情传播 } else { return QWidget::eventFilter(obj,e); } } else { //其他的就按照原来的方式进行处理 return QWidget::eventFilter(obj,e); } }