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_())