其存在的意義:
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); } }