事件過濾器可在 event() 分發前攔截事件,避免大量重寫 event()。QObject::eventFilter() 簽名:
virtual bool QObject::eventFilter(QObject *watched, QEvent *event);
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if (obj == textEdit) {
if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
qDebug() << "Ate key press" << keyEvent->key();
return true; // 過濾掉此事件
}
return false; // 其他事件繼續處理
}
return QMainWindow::eventFilter(obj, event); // 其他物件交給父類
}
textEdit->installEventFilter(this); // this 實作了 eventFilter
可安裝至任意 QObject 子類。多重過濾器採堆疊行為:最後安裝者最先調用。亦可安裝至 QApplication 過濾所有事件,但會降低分發效能。
delete 接收物件,必須返回 true,否則 Qt 仍會分發事件導致崩潰mousePressEvent)event() 函式QApplication 安裝事件過濾器QCoreApplication::notify()控制權逐層遞增,notify() 為最終入口。