Qt事件处理(四)
Qt处理事件的第四种方式:"在QApplication中注册事件过滤器",如果一个事件过滤器被注册到程序中唯一的QApplication对象,应用程序中所有对象里的每一个事件都会在它们被送达其他事件事件过滤器之前,首先抵到这个eventFilter()函数。
在这里继承一个QWidget用来注册QApplication事件过滤器,MyWidget的头文件mywidget.h如下:
#ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> #include <QMouseEvent> class MyWidget : public QWidget { public: MyWidget(); protected: bool eventFilter(QObject *obj, QEvent *e); }; #endif
mywidget.cpp文件如下:
#include "mywidget.h" MyWidget::MyWidget() { } bool MyWidget::eventFilter(QObject *obj, QEvent *e) { //屏蔽MouseButtonPress、MouseButtonRelease和MouseMove事件 if (e->type() == QEvent::MouseButtonPress || e->type() == QEvent::MouseButtonRelease || e->type() == QEvent::MouseMove) { return true; } return QWidget::eventFilter(obj, e); }
在这里,我们把button称为目标对象,MainWindow实现了eventFilter()函数,用MainWindow来监视button,称MainWindow为监视对象。
mainwindow.h文件如下:
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QtGui/QMainWindow> #include <QPushButton> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); ~MainWindow(); protected: bool eventFilter(QObject *obj, QEvent *e); private: QPushButton *button; }; #endif
mainwindow.cpp文件如下:
#include "mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { button = new QPushButton; this->setCentralWidget(button); button->installEventFilter(this); //为button设置过滤器 } MainWindow::~MainWindow() { } bool MainWindow::eventFilter(QObject *obj, QEvent *e) { if (obj == button) //响应button的MouseButtonPress、MouseButtonRelease和MouseMove事件 { if (e->type() == QEvent::MouseButtonPress) { QMouseEvent *event = static_cast<QMouseEvent*> (e); button->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); button->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); button->setText(QString("Move: %1, %2").arg(QString::number(event->x()), QString::number(event->y()))); return true; } else { return false; } } return QMainWindow::eventFilter(obj, e); }
运行程序,可以发现button不管是点击、释放还是拖动鼠标,都不会显示任何文本。因为我们已经为QApplication注册了事件过滤器,事件在到达button的监视对象MainWindow之前,会先到达QApplication的事件过滤器MyWidget的事件处理函数eventFilter()函数,该函数屏蔽了所有的MouseButtonPress、MouseButtonRelease和MouseMove事件。所以为button对象注册的事件过滤器不起作用。程序运行界面为: