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

Qt學習之路(23):自訂事件 Custom Event 完整實作指南

     編輯:關於C++

Qt 允許建立自訂事件類型,多執行緒程式中特別有用,單執行緒也可作為物件間通訊機制。事件優於信號槽之處:支援同步與非同步分發、可使用事件過濾器。

自訂事件實作步驟

  1. 繼承 QEvent(Qt3 為 QCustomEvent,Qt4 棄用)
  2. 提供 QEvent::Type 類型值,範圍在 QEvent::User (1000) 至 QEvent::MaxUser (65535)
  3. 使用 QEvent::registerEventType() 註冊類型,避免衝突,線程安全
static int QEvent::registerEventType(int hint = -1);

事件發送兩種方式

  • sendEvent():同步直接發送,需在堆疊建立物件
    QMouseEvent event(QEvent::MouseButtonPress, pos, 0, 0, 0);
    QApplication::sendEvent(mainWindow, &event);
  • postEvent():非同步加入事件佇列,需在堆積建立物件,Qt 自動刪除
    QApplication::postEvent(object, new MyEvent(QEvent::registerEventType(2048)));
    另有重載版本支援優先級,sendPostedEvents() 可立即處理已提交事件。

事件處理

重寫 customEvent(QEvent*) 或 event(QEvent*):

// 方式一
void CustomWidget::customEvent(QEvent *event) {
    CustomEvent *customEvent = static_cast<CustomEvent*>(event);
    // 處理...
}

// 方式二
bool CustomWidget::event(QEvent *event) {
    if (event->type() == MyCustomEventType) {
        CustomEvent *myEvent = static_cast<CustomEvent*>(event);
        // 處理...
        return true;
    }
    return QWidget::event(event);
}

至此 Qt 事件機制核心(分發、過濾、自訂)已介紹完畢,下章進入 2D 繪圖領域。

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