Qt 允許建立自訂事件類型,多執行緒程式中特別有用,單執行緒也可作為物件間通訊機制。事件優於信號槽之處:支援同步與非同步分發、可使用事件過濾器。
QEvent(Qt3 為 QCustomEvent,Qt4 棄用)QEvent::Type 類型值,範圍在 QEvent::User (1000) 至 QEvent::MaxUser (65535)QEvent::registerEventType() 註冊類型,避免衝突,線程安全static int QEvent::registerEventType(int hint = -1);
QMouseEvent event(QEvent::MouseButtonPress, pos, 0, 0, 0);
QApplication::sendEvent(mainWindow, &event);
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 繪圖領域。