mylineedit.h
如下:
#ifndef MYLINEEDIT_H
#define MYLINEEDIT_H
#include <QLineEdit>
class MyLineEdit : public QLineEdit {
Q_OBJECT
public:
explicit MyLineEdit ( QWidget *parent = 0 );
bool event ( QEvent *event );
protected:
void keyPressEvent ( QKeyEvent *event );
signals:
public slots:
};
#endif // MYLINEEDIT_H
widget.h
如下:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;
}
class MyLineEdit;
class Widget : public QWidget {
Q_OBJECT
public:
explicit Widget ( QWidget *parent = 0 );
~Widget();
bool eventFilter ( QObject *obj, QEvent *event );
protected:
void keyPressEvent ( QKeyEvent *event );
private:
Ui::Widget *ui;
MyLineEdit *lineEdit;
};
#endif // WIDGET_H
widget.cpp
如下:
#include "widget.h"
#include "ui_widget.h"
#include "mylineedit.h"
#include <QKeyEvent>
#include <QDebug>
Widget::Widget ( QWidget *parent ) : QWidget ( parent ), ui ( new Ui::Widget ) {
ui->setupUi ( this );
lineEdit = new MyLineEdit ( this );
lineEdit->move ( 100, 100 );
lineEdit->installEventFilter ( this ); /* 在Widget上为lineEdit安装事件过滤器 */
}
Widget::~Widget() {
delete ui;
}
void Widget::keyPressEvent ( QKeyEvent *event ) {
qDebug() << tr ( "Widget键盘按下事件" );
}
bool Widget::eventFilter ( QObject *obj, QEvent *event ) { /* 事件过滤器 */
if ( obj == lineEdit ) { /* 如果是lineEdit部件上的事件 */
if ( event->type() == QEvent::KeyPress ) {
qDebug() << tr ( "Widget的事件过滤器" );
}
}
return QWidget::eventFilter ( obj, event );
}
mylineedit.cpp
如下:
#include "mylineedit.h"
#include <QKeyEvent>
#include <QDebug>
MyLineEdit::MyLineEdit ( QWidget *parent ) : QLineEdit ( parent ) {
}
void MyLineEdit::keyPressEvent ( QKeyEvent *event ) { /* 键盘按下事件 */
qDebug() << tr ( "MyLineEdit键盘按下事件" );
QLineEdit::keyPressEvent ( event ); /* 执行QLineEdit类的默认事件处理 */
event->ignore(); /* 忽略该事件 */
}
bool MyLineEdit::event ( QEvent *event ) { /* 事件 */
if ( event->type() == QEvent::KeyPress ) {
qDebug() << tr ( "MyLineEdit的event()函数" );
}
return QLineEdit::event ( event ); /* 执行QLineEdit类event函数的默认操作 */
}
在事件过滤器中,先判断该事件的对象是不是lineEdit
,如果是,再判断事件类型。最后返回了QWidget
类默认的事件过滤器的执行结果。
可以看到,事件的传递顺序是这样的:先是事件过滤器,然后是该部件的event
函数,最后是该部件的事件处理函数。这里还要注意,event
和事件处理函数是在该部件内进行重新定义的,而事件过滤器却是在该部件的父部件中进行定义的。