event() 是事件分發中樞,不直接處理事件,而是根據類型分派給對應處理器(keyPressEvent、mousePressEvent 等)。
例: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() 不同:後者用於事件處理器間溝通,前者通知事件循環。
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() 進行分派,否則永不被調用。下章將介紹事件接受與忽略機制。