事件分發前需攔截特定組件的特定事件(如對話框中某輸入框屏蔽 Enter 鍵),逐個重寫 event() 低效。Qt 提供**事件過濾器**機制:統一攔截、判斷、決定是否繼續分發。
eventFilter()virtual bool QObject::eventFilter(QObject *watched, QEvent *event);
watched:被監視的目標組件event:待處理事件true:**過濾掉**事件(不再分發給目標)false:繼續正常分發流程bool MainWindow::eventFilter(QObject *obj, QEvent *event) {
if (obj == textEdit) {
if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast(event);
qDebug() << "Ate key press" << keyEvent->key();
return true; // 吞掉所有按鍵事件
}
return false; // 其他事件繼續分發
}
// 其他組件:調用父類實現,保持鏈路完整
return QMainWindow::eventFilter(obj, event);
}
installEventFilter()textEdit->installEventFilter(this); // this 為 MainWindow,已重寫 eventFilter
QObject 子類,不限 UI 組件qApp (QApplication) 可全域過濾,但會降低分發效率delete watched 卻返回 false,Qt 仍會分發事件給已銷毀對象 → 崩潰QCoreApplication::notify() 分發,重寫它擁有最高控制權mousePressEvent 等)QObject::event()QApplication 全域事件過濾器QCoreApplication::notify()控制權遞增,按需選擇合適層次。本文出自「豆子空間」博客。