Qt處理事件的第三種方式:"在QObject中注冊事件過濾器",如果對象使用installEventFilter()函數注冊了事件過濾器,目標對象中的所有事件將首先發給這個監視對象的eventFilter()函數。
mybutton.h文件如下:
#ifndef MYBUTTON_H #define MYBUTTON_H #include <QPushButton> #include <QMouseEvent> class MyButton : public QPushButton { protected: bool event(QEvent *e); }; #endif
mybutton.cpp文件如下:
#include "mybutton.h" bool MyButton::event(QEvent *e) { if (e->type() == QEvent::MouseButtonPress) { QMouseEvent *event = static_cast<QMouseEvent*> (e); this->setText(QString("Press: %1, %2").arg(QString::number(event->x()), QString::number(event->y()))); return true; } else if (e->type() == QEvent::MouseButtonRelease) { QMouseEvent *event = static_cast<QMouseEvent*> (e); this->setText(QString("Release: %1, %2").arg(QString::number(event->x()), QString::number(event->y()))); return true; } else if (e->type() == QEvent::MouseMove) { QMouseEvent *event = static_cast<QMouseEvent*> (e); this->setText(QString("Move: %1, %2").arg(QString::number(event->x()), QString::number(event->y()))); return true; } return QPushButton::event(e); //其他事件調用基類的event()函數進行處理 }
在這里,我們把button稱為目標對象,MainWindow實現了eventFilter()函數,用MainWindow來監視button,稱MainWindow為監視對象。
mainwindow.h文件如下:
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QtGui/QMainWindow> #include "mybutton.h" class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); ~MainWindow(); protected: bool eventFilter(QObject *obj, QEvent *e); private: MyButton *button; }; #endif
mainwindow.cpp文件如下:
#include "mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { button = new MyButton; this->setCentralWidget(button); button->installEventFilter(this); //為button設置過濾器 } MainWindow::~MainWindow() { } bool MainWindow::eventFilter(QObject *obj, QEvent *e) { if (obj == button) { if (e->type() == QEvent::MouseButtonRelease || e->type() == QEvent::MouseMove) //屏蔽MouseButtonRelease和MouseMove事件 { return true; } else { return false; } } return QMainWindow::eventFilter(obj, e); }
運行程序,可以發現button的文本不管是點擊、釋放還是拖動鼠標,都只顯示鼠標按下的文本,因為我們已經為button注冊了事件過濾器,在監視對象MainWindow中,事件處理函數eventFilter()函數屏蔽了button的MouseButtonRelease和MouseMove事件。所以目標對象button的MouseButtonRelease和MouseMove事件得不到響應。
故事件是先經過監視對象的eventFilter()函數,然后在響應目標對象button的所有事件,程序運行界面為:

