from PyQt5.QtCore import QEvent, QObject
from PyQt5.QtWidgets import QApplication
import sys# 自定義事件類
class CustomEvent(QEvent):# PYQT5 預留給用戶自定義事件類型的起點為 QEvent.User=1000custom_event_type = QEvent.registerEventType()# 也可以這樣寫# custom_event_type = QEvent.User + 1def __init__(self):super().__init__(CustomEvent.custom_event_type)self.send_data = None# 配置發送事件時附帶的數據(可選)def init_send_data(self, send_data):self.send_data = send_data# 自定義事件接收者類
class CustomEventReceiver(QObject):# 如果不是直接繼承自 QObject 則只能重寫該方法# 如果是直接繼承自 QObject 則可以選擇以下任意一種def event(self, event):if event.type() == CustomEvent.custom_event_type:print('[事件消息]: ', event.send_data)return Trueelse:return False# 該方法專門用于處理自定義事件# 只有直接繼承自 QObject 的類可以重寫該方法# 自定義事件如果依附于新的類(繼承自QObject)且僅有一種自定義事件,則代表它不會有其它多余的事件,既然只有一個事件,就不需要判斷事件類型了def customEvent(self, event):# 若只有一種自定義事件類型,則可以省略類型判斷if event.type() == CustomEvent.custom_event_type:print('[事件消息]: ', event.send_data)if __name__ == '__main__':app = QApplication(sys.argv)# =================================發送自定義事件-BEG=================================# 創建自定義事件custom_event = CustomEvent()# 為自定義事件設置傳輸數據info = '隨事件發送的數據'custom_event.init_send_data(info)# 創建事件接收者event_reveiver = CustomEventReceiver()# 發送事件# 任何 QCoreApplication 或其子類的對象都可以執行 sendEvent | postEvent 發送事件# sendEvent-該方法將立即發送事件,并且當前線程會被阻塞直到事件處理完成(適用于實時性較高的場景)# postEvent-該方法將事件放在事件隊列中,然后立即返回,事件會在事件循環的下一個周期中被處理(適用于實時性不高的場景)# 事件對象處理后會被銷毀,所以需要在每次循環中創建新的事件對象,并發送該新對象,保證每個事件對象只被處理一次# app.sendEvent(event_reveiver, custom_event)app.postEvent(event_reveiver, custom_event)# =================================發送自定義事件-END=================================sys.exit(app.exec_())
