Qt 事件傳遞呈鏈狀結構。本篇深入解析 accept()/ignore()、父類調用與事件傳播的關係、何時必須顯式使用接受/忽略、關閉事件的特殊處理。
子類重寫事件處理函數時,若不處理某事件,有兩種做法:
void MyLabel::mousePressEvent(QMouseEvent *event) {
if (event->button() == Qt::LeftButton) {
// 處理左鍵
} else {
QLabel::mousePressEvent(event); // 傳遞給父類
}
}
void MyLabel::mousePressEvent(QMouseEvent *event) {
if (event->button() == Qt::LeftButton) {
// 處理左鍵
event->accept(); // 可選,預設即接受
} else {
event->ignore(); // 標記忽略,Qt 繼續尋找接收者
}
}
查看 QWidget::mousePressEvent() 源碼:
void QWidget::mousePressEvent(QMouseEvent *event) {
event->ignore(); // 預設忽略,繼續向父組件傳播
if (windowType() == Qt::Popup) { ... } // 彈出視窗特殊邏輯
}
ignore() 會跳過父類邏輯,潛在風險ignore() 繼續傳播,**雙贏**closeEvent() 無父類預設實現可呼叫,必須顯式決定:
void MainWindow::closeEvent(QCloseEvent *event) {
if (confirmToClose()) {
event->accept(); // 允許關閉,事件傳播結束
} else {
event->ignore(); // 拒絕關閉,視窗保持開啟
}
}
bool MainWindow::confirmToClose() {
return QMessageBox::question(this, "Quit",
"Are you sure to quit?",
QMessageBox::Yes | QMessageBox::No,
QMessageBox::No) == QMessageBox::Yes;
}
event->isAccepted():檢查事件當前是否已被接受mousePressEvent 等)QObject::event() 統一分發QApplication 安裝全域事件過濾器QCoreApplication::notify() 終極攔截本文出自「豆子空間」博客。