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

Qt學習之路(20):事件接受與忽略 accept() / ignore() 機制詳解

     編輯:關於C++

Qt 事件傳遞呈鏈狀:子類未處理則向上傳遞。事件物件提供 accept()(接收,停止傳遞)與 ignore()(忽略,繼續傳遞),isAccepted() 查詢狀態。

常見模式:調用父類處理函式而非直接 ignore()

void MyLabel::mousePressEvent(QMouseEvent *event) {
    if (event->button() == Qt::LeftButton) {
        // 處理左鍵
    } else {
        QLabel::mousePressEvent(event);  // 推薦:調用父類而非 ignore()
    }
}

原因:父類處理函式可能有必要邏輯(如 Popup 視窗關閉),直接 ignore() 會跳過父類邏輯造成潛在問題。

QWidget::mousePressEvent() 內部實作

void QWidget::mousePressEvent(QMouseEvent *event) {
    event->ignore();  // 預設忽略
    if (windowType() == Qt::Popup) {
        event->accept();
        // Popup 關閉邏輯...
    }
}

若子類直接 ignore(),Popup 關閉邏輯不會執行。

必須使用 accept()/ignore() 的情況:視窗關閉事件

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() 的經典應用場景。

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