Qt 事件傳遞呈鏈狀:子類未處理則向上傳遞。事件物件提供 accept()(接收,停止傳遞)與 ignore()(忽略,繼續傳遞),isAccepted() 查詢狀態。
void MyLabel::mousePressEvent(QMouseEvent *event) {
if (event->button() == Qt::LeftButton) {
// 處理左鍵
} else {
QLabel::mousePressEvent(event); // 推薦:調用父類而非 ignore()
}
}
原因:父類處理函式可能有必要邏輯(如 Popup 視窗關閉),直接 ignore() 會跳過父類邏輯造成潛在問題。
void QWidget::mousePressEvent(QMouseEvent *event) {
event->ignore(); // 預設忽略
if (windowType() == Qt::Popup) {
event->accept();
// Popup 關閉邏輯...
}
}
若子類直接 ignore(),Popup 關閉邏輯不會執行。
void MainWindow::closeEvent(QCloseEvent *event) {
if (continueToClose()) {
event->accept(); // 允許關閉
} else {
event->ignore(); // 取消關閉
}
}
bool MainWindow::continueToClose() {
return QMessageBox::question(this, tr("Quit"),
tr("Are you sure to quit?"),
QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes;
}
詢問使用者確認後決定是否接受關閉事件,這是 accept()/ignore() 的經典應用場景。