Qt事件过滤器的使用
事件过滤器事件:void QObject::installEventFilter( QObject *filterObj ),示例:
monitoredObj->installEventFilter( filterObj );
继承自QObject类的对象都可以安装事件过滤器,也就是说 mobitoredObj、filterObj 这两个对象必须都继承自QObject类。filterObj 对象会接收所有发送给 monintoredObj 对象的事件,并在 eventFilter() 函数中处理,也就是说要在 filterObj 对象的类中定义实现 eventFilter() 函数。eventFilter() 函数原型为:
virtual bool eventFilter( QObject *obj, QEvent *e );
eventFilter() 函数中可以选择结束事件(即过滤掉事件),也可以继续向前传递事件给 monitoredObj 对象。
下面给出Qt帮助文档中的代码示例
class KeyPressEater : public QObject
{
Q_OBJECT
protected:
bool eventFilter( QObject *obj, QEvent *event );
}
bool KeyPreeEater::eventFilter( QObject *obj, QEvent *event )
{
if( event->type() == QEvent::KeyPress ) {
QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
qDebug( "Ate key press %d", keyEvent->key() );
return true;//事件结束
} else {
return QObject::eventFilter( obj, event );//事件传递给 monitoredObj 对象
}
}
安装过滤器步骤:
KeyPressEater *keyPressEater = new KeyPressEater( this );
QPushButton *pushButton = new QPushButton( this );
QListView *listView = new QListView( this );
pushButton->installEventFilter( keyPressEater );//安装过滤器后 keyPressEater 对象可以接收 pushButton 对象的所有事件,并在 KeyPressEater::eventFilter( QObject *obj, QEvent *event ) 函数中处理。
listView->installEventFilter( keyPressEater );