| 特性 | 信號槽 | 事件 |
| 發送者 | 具體物件 | 系統/Qt 內部 |
| 處理機制 | 直接連線,同步調用 slot | 事件隊列,先進先出處理 |
| 過濾能力 | 無 | 事件過濾器 |
| 適用場景 | 使用組件時 | 自定義組件時 |
使用現有組件關注信號(如 clicked());自定義組件需重寫事件處理函數(如 mousePressEvent())並在適當時機發射信號。
三、事件循環與分發流程
QApplication::exec() 啟動事件循環
- 事件發生 → 建立繼承自
QEvent 的事件物件
- 投遞給
QObject::event(QEvent*)
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() 兩種格式化風格均支援
- 重寫事件處理函數時,**若不處理某事件,應呼叫父類實現**以保持預設行為
本文出自「豆子空間」博客。
- 上一篇文章: Qt 學習之路 (18):標準輸入對話框 QInputDialog 詳解
- 下一篇文章: C51 單片機開發中函數指針的陷阱與變量重疊問題
Copyright ©
程式碼之家 All Rights Reserved