Qt的事件模型中提供的事件过滤功能使得一个QObject对象可以监视另一个QObject对象中的事件,通过在一个QObject对象中安装事件过滤器可以在事件到达该对象前捕获事件,从而起到监视该对象事件的效果。
实现类似功能的另一种方式是通过分别继承不同的控件类,并重构各控件的事件响应函数,但若窗体中包含大量不同的控件时,每一个控件都必须重新继承,然后分别重构不同的事件函数,实现比较复杂。事件过滤器可以实现在窗体中监视全部控件的不同事件,方便实现功能扩展。
`
- #ifndef WIDGET_H
- #define WIDGET_H
- #include <QWidget>
- namespace Ui {
- class Widget;
- }
- class Widget : public QWidget
- {
- Q_OBJECT
- public:
- explicit Widget(QWidget *parent = 0);
- ~Widget();
- public slots:
- bool eventFilter(QObject *,QEvent *); //注意这里
- private:
- Ui::Widget *ui;
- };
- #endif // WIDGET_H
`
- #include "widget.h"
- #include "ui_widget.h"
- #include <QPalette>
- Widget::Widget(QWidget *parent) :
- QWidget(parent),
- ui(new Ui::Widget)
- {
- ui->setupUi(this);
- ui->lineEdit1->installEventFilter(this); //在窗体上为lineEdit1安装过滤器
- ui->lineEdit2->installEventFilter(this); //在窗体上为lineEdit2安装过滤器
- }
- Widget::~Widget()
- {
- delete ui;
- }
- bool Widget::eventFilter(QObject *watched, QEvent *event)
- {
- if (watched==ui->lineEdit1) //首先判断控件(这里指 lineEdit1)
- {
- if (event->type()==QEvent::FocusIn) //然后再判断控件的具体事件 (这里指获得焦点事件)
- {
- QPalette p=QPalette();
- p.setColor(QPalette::Base,Qt::green);
- ui->lineEdit1->setPalette(p);
- }
- else if (event->type()==QEvent::FocusOut) // 这里指 lineEdit1 控件的失去焦点事件
- {
- QPalette p=QPalette();
- p.setColor(QPalette::Base,Qt::white);
- ui->lineEdit1->setPalette(p);
- }
- }
- if (watched==ui->lineEdit2) //这里来处理 lineEdit2 , 和处理lineEdit1 是一样的
- {
- if (event->type()==QEvent::FocusIn)
- {
- QPalette p=QPalette();
- p.setColor(QPalette::Base,Qt::green);
- ui->lineEdit2->setPalette(p);
- }
- else if (event->type()==QEvent::FocusOut)
- {
- QPalette p=QPalette();
- p.setColor(QPalette::Base,Qt::white);
- ui->lineEdit2->setPalette(p);
- }
- }
- return QWidget::eventFilter(watched,event); // 最后将事件交给上层对话框
- }
`
`
另外,我在一本书上看到作者有一个例子是关于动态按钮的:鼠标未按下时没有任何反应,当鼠标左键按下时图片变大,松开鼠标后又恢复原来的状态。其实这个效果和我这个例子是一个道理,也就是监听按钮的按下事件(QEvent::MouseButtonPress)和释放事件(QEvent::MouseButtonRelease)
`
- bool EventFilter::eventFilter(QObject *watched,QEvent *event)
- {
- if (watched==Label1)
- {
- if (event->type()==QEvent::MouseButtonPress)
- {
- QMouseEvent *mouseEvent=static_cast<QMouseEvent *>event;
- if (mouseEvent->buttons() && Qt::LeftButton)
- { // 更换一张大一点的图片 ..........
- }
- if (event->type()==QEvent::MouseButtonRelease)
- { // 重新换回最初那张图片 ...........
- }
- return QWidget::eventFilter(watched,event);
- }