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

Qt學習之路(21):event() 函式——事件分發核心機制

     編輯:關於C++

event() 是事件分發中樞,不直接處理事件,而是根據類型分派給對應處理器(keyPressEvent、mousePressEvent 等)。

重寫 event() 攔截特定事件

例:Tab 鍵移動焦點而非讓當前元件處理:

bool MyWidget::event(QEvent *event) {
    if (event->type() == QEvent::KeyPress) {
        QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
        if (keyEvent->key() == Qt::Key_Tab) {
            // 處理 Tab 鍵
            return true;
        }
    }
    return QWidget::event(event);  // 其他事件交給父類
}

回傳值語意

  • true:事件已識別並處理,QApplication 處理下一事件
  • false:未處理,QApplication 尋找下一處理函式

此回傳值與 accept()/ignore() 不同:後者用於事件處理器間溝通,前者通知事件循環。

QWidget::event() 內部實作邏輯

bool QWidget::event(QEvent *event) {
    switch (event->type()) {
    case QEvent::KeyPress:
        keyPressEvent((QKeyEvent*)event);
        if (!((QKeyEvent*)event)->isAccepted()) return false;
        break;
    case QEvent::KeyRelease:
        keyReleaseEvent((QKeyEvent*)event);
        if (!((QKeyEvent*)event)->isAccepted()) return false;
        break;
    // more...
    }
    return true;
}

巨大 switch 分派,檢查 isAccepted() 決定回傳值。

自訂事件必須重寫 event()

若有自訂事件,必須重寫 event() 進行分派,否則永不被調用。下章將介紹事件接受與忽略機制。

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