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

Qt 學習之路 (19):事件機制核心原理與自定義事件處理

     編輯:關於C語言

前言

Qt 事件系統是框架核心之一。本篇從事件來源、事件循環、分發機制、事件處理函數到自定義組件實戰,系統闡述事件處理全貌。

一、事件來源與分類

  • 用戶觸發:滑鼠點擊、鍵盤輸入、觸控等
  • 系統自動:計時器事件、重繪事件、佈局變更等

二、事件與信號槽的區別

使用現有組件關注信號(如 clicked());自定義組件需重寫事件處理函數(如 mousePressEvent())並在適當時機發射信號。

三、事件循環與分發流程

  1. QApplication::exec() 啟動事件循環
  2. 事件發生 → 建立繼承自 QEvent 的事件物件
  3. 投遞給 QObject::event(QEvent*)
  4. event() 依事件型別分派給具體處理函數(mousePressEvent() 等)

四、QWidget 內建事件處理函數

均為 protected virtual,供子類重寫:

  • 鍵盤:keyPressEvent()、keyReleaseEvent()
  • 滑鼠:mousePressEvent()、mouseReleaseEvent()、mouseMoveEvent()、mouseDoubleClickEvent()
  • 其他:paintEvent()、resizeEvent()、closeEvent() 等

五、實戰:自定義滑鼠事件標籤

class EventLabel : public QLabel {
protected:
    void mouseMoveEvent(QMouseEvent *event) override;
    void mousePressEvent(QMouseEvent *event) override;
    void mouseReleaseEvent(QMouseEvent *event) override;
};

void EventLabel::mouseMoveEvent(QMouseEvent *event) {
    setText(QString("<center><h1>Move: (%1, %2)</h1></center>")
            .arg(event->x()).arg(event->y()));
}

void EventLabel::mousePressEvent(QMouseEvent *event) {
    setText(QString("<center><h1>Press: (%1, %2)</h1></center>")
            .arg(event->x()).arg(event->y()));
}

void EventLabel::mouseReleaseEvent(QMouseEvent *event) {
    QString msg;
    msg.sprintf("<center><h1>Release: (%d, %d)</h1></center>",
                event->x(), event->y());
    setText(msg);  // 示範 C 風格 sprintf 構造 QString
}

main() 僅需建立 EventLabel、設定標題大小、show() 並進入 app.exec()。

六、關鍵技術點

  • 事件參數(QMouseEvent*)提供座標、按鍵狀態、修飾鍵等豐富資訊
  • QString::arg() 與 sprintf() 兩種格式化風格均支援
  • 重寫事件處理函數時,**若不處理某事件,應呼叫父類實現**以保持預設行為

本文出自「豆子空間」博客。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性信號槽事件
發送者具體物件系統/Qt 內部
處理機制直接連線,同步調用 slot事件隊列,先進先出處理
過濾能力無事件過濾器
適用場景使用組件時自定義組件時