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

Qt學習之路(22):事件過濾器 Event Filter 實戰應用

     編輯:關於C++

事件過濾器可在 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 仍會分發事件導致崩潰
  • 過濾器與被監視物件必須在同一執行緒,否則失效

事件處理五層控制權

  1. 重寫事件處理函式(如 mousePressEvent)
  2. 重寫 event() 函式
  3. 單一元件安裝事件過濾器
  4. QApplication 安裝事件過濾器
  5. 重寫 QCoreApplication::notify()

控制權逐層遞增,notify() 為最終入口。

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