Qt事件处理(四)
2012-10-11 20:00
267 查看
Qt处理事件的第四种方式:"在QApplication中注册事件过滤器",如果一个事件过滤器被注册到程序中唯一的QApplication对象,应用程序中所有对象里的每一个事件都会在它们被送达其他事件事件过滤器之前,首先抵到这个eventFilter()函数。
在这里继承一个QWidget用来注册QApplication事件过滤器,MyWidget的头文件mywidget.h如下:
mywidget.cpp文件如下:
在这里,我们把button称为目标对象,MainWindow实现了eventFilter()函数,用MainWindow来监视button,称MainWindow为监视对象。
mainwindow.h文件如下:
mainwindow.cpp文件如下:
运行程序,可以发现button不管是点击、释放还是拖动鼠标,都不会显示任何文本。因为我们已经为QApplication注册了事件过滤器,事件在到达button的监视对象MainWindow之前,会先到达QApplication的事件过滤器MyWidget的事件处理函数eventFilter()函数,该函数屏蔽了所有的MouseButtonPress、MouseButtonRelease和MouseMove事件。所以为button对象注册的事件过滤器不起作用。程序运行界面为:
在这里继承一个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对象注册的事件过滤器不起作用。程序运行界面为:
相关文章推荐
- 初步剖析QT事件处理过程(Windows)(上)
- QT绘图高级技术(一)GraphicsView框架事件处理
- Qt之Tab键实现(自由切换焦点)—— 采用事件过滤器处理
- qt之键盘、鼠标事件处理
- Qt中的事件处理
- Qt事件处理(二)
- Qt的事件处理机制分析
- Qt获得焦点和失去焦点处理事件 (Focus事件)
- QT学习之事件处理
- Qt事件处理机制详解
- Qt中事件处理的顺序
- qt焦点事件响应捕捉处理,事件过滤器
- 详解 QT Event 以及 Event Filter 事件处理
- Qt ------ 覆盖eventFilter(),捕获组件事件,事件处理
- QT 中 事件处理转移
- Qt 事件处理
- Qt事件处理机制整个流程--以鼠标在一个窗口中点击为例
- Qt事件处理(三)
- Qt事件处理(五)
- Qt中事件处理的方法