Qt事件過濾器的使用

百無一用狂書生發表於2019-01-07

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 );

 

相關文章