首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Qt 學習之路 (22):事件過濾器機制與安裝實戰

     編輯:關於C語言

前言

事件分發前需攔截特定組件的特定事件(如對話框中某輸入框屏蔽 Enter 鍵),逐個重寫 event() 低效。Qt 提供**事件過濾器**機制:統一攔截、判斷、決定是否繼續分發。

核心虛函數 eventFilter()

virtual bool QObject::eventFilter(QObject *watched, QEvent *event);
  • watched:被監視的目標組件
  • event:待處理事件
  • 回傳 true:**過濾掉**事件(不再分發給目標)
  • 回傳 false:繼續正常分發流程

實戰範例:屏蔽 QTextEdit 的鍵盤事件

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) 可全域過濾,但會降低分發效率

關鍵注意事項

  1. 刪除目標組件時必須返回 true:若在過濾器中 delete watched 卻返回 false,Qt 仍會分發事件給已銷毀對象 → 崩潰
  2. 線程親和性:過濾器與被監視組件**必須在同一線程**,否則失效。跨線程移動後需回到同一線程才生效
  3. 事件最終經 QCoreApplication::notify() 分發,重寫它擁有最高控制權

五層次事件控制權模型(重溫)

  1. 重寫具體事件處理函數 (mousePressEvent 等)
  2. 重寫 QObject::event()
  3. 單組件安裝事件過濾器
  4. QApplication 全域事件過濾器
  5. 重寫 QCoreApplication::notify()

控制權遞增,按需選擇合適層次。本文出自「豆子空間」博客。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved