当前位置:   article > 正文

实战PyQt5: 103-自定义事件_pyqt 自定义事件

pyqt 自定义事件

创建自定义事件

虽然Qt内建了大量的事件类, 可以满足开发一个应用的绝大部分需求,但是有时候我们希望使用自定义事件来达到某个目的。实现自定义事件的步骤如下:

  • 创建一个继承自QEvent的类,例如: class MyEvent(QEvent)。
  • 定义事件类型(取值在QEvent.User和QEvent.MaxUser之间,建议使用registerEventType()函数自动创建一个全局唯一一个的事件类型,防止重复)。
  • 使用QCoreApplication的静态方法sendEvent()或postEvent()发送事件。
  • 在创建的类(比如:MyEvent)中重写event()或者customEvent()方法处理自定义事件。

发送事件有两种方法,一种是使用sendEvent()函数,一种是使用postEvent()函数。

1. sendEvent()函数: 该函数是阻塞式调用,它发送的对象事件,等待接收对象处理结束后才返回。其原型如下:

QCoreApplication.sendEvent(receiver : QObject, event : 'QEvent'),

参数:receiver为接收事件对象, event为传递的事件对象;

返回值:若事件被处理返回True,否则返回False。

2. postEvent()函数:该函数是异步调用,它向事件队列中登记一个指定接收者的事件,然后返回。 这种方法是线程安全的,因此它可以在多线程应用程序中用于在线程之间交换事件。其函数原型如下:

QCoreApplication.post(receiver: QObject, event: 'QEvent', priority: int = ...)

参数:receiver为接收事件对象; event为传递的事件对象;priority为优先级,其取值为枚举变量中Qt. EventPriority的值。

测试自定义事件

点击‘生成自定义事件按钮’,在其中以postEvent()和sendEvent()两种方式发送自定义事件,从下面的输出信息可以看到,函数先处理了sendEvent()函数的事件,等事件循环运行时分发给当前对象后处理postEvent()事件。完整代码如下:

  1. import sys
  2. from PyQt5 import QtCore, QtGui, QtWidgets
  3. from PyQt5.QtCore import Qt, QEvent, QCoreApplication
  4. from PyQt5.QtWidgets import (QApplicationQWidgetQPushButton
  5.                              QPlainTextEditQLabelQVBoxLayout
  6.                              QSpacerItemQSizePolicy)
  7.  
  8. class CustomEvent(QEvent):
  9.     #注册事件类型
  10.     idType = QEvent.registerEventType()
  11.     
  12.     def __init__(selfdata):
  13.         super(CustomEventself).__init__(CustomEvent.idType)
  14.         self.data = data
  15.         
  16.     def getData(self):
  17.         return self.data
  18.  
  19. class DemoCustomEvent(QWidget):
  20.     def __init__(selfparent=None):
  21.         super(DemoCustomEventself).__init__(parent)   
  22.         
  23.          # 设置窗口标题
  24.         self.setWindowTitle('实战PyQt5: 自定义事件演示')      
  25.         # 设置窗口大小
  26.         self.resize(400, 240)
  27.       
  28.         self.initUi()
  29.         
  30.     def initUi(self):
  31.         mainLayout = QVBoxLayout()
  32.         btnCreateEvent = QPushButton('生成自定义事件事件',self)
  33.         btnCreateEvent.setMinimumHeight(40)
  34.         btnCreateEvent.clicked.connect(self.onButtonCreateEvent)
  35.         self.textBox = QPlainTextEdit(self)
  36.         self.textBox.setReadOnly(True)
  37.         mainLayout.addWidget(btnCreateEvent)
  38.         #添加一段垂直间隔
  39.         vSpacer = QSpacerItem(20, 20, QSizePolicy.ExpandingQSizePolicy.Fixed)
  40.         mainLayout.addItem(vSpacer)
  41.         #输出信息显示
  42.         mainLayout.addWidget(QLabel('输出信息显示', self))
  43.         mainLayout.addWidget(self.textBox)
  44.         self.setLayout(mainLayout)
  45.         
  46.     def onButtonCreateEvent(self):
  47.         # 使用PostEvent方式发送
  48.         postEvent = CustomEvent('Post Custom Event')
  49.         QCoreApplication.postEvent(selfpostEvent)
  50.         
  51.         # 使用SendEvent方式发送
  52.         sendEvent = CustomEvent('Send Custom Event')
  53.         result = QCoreApplication.sendEvent(selfsendEvent)
  54.         self.textBox.appendPlainText('发送事件结果是: {0}'.format(result))
  55.         
  56.     def customEvent(selfevt):
  57.         if(evt.type() == CustomEvent.idType):
  58.             self.textBox.appendPlainText('事件发送方式: {0}'.format(evt.getData()))
  59.     
  60.     '''    
  61.     def event(selfevt):
  62.         if(evt.type() == CustomEvent.idType):
  63.             self.textBox.appendPlainText('事件发送方式: {0}'.format(evt.getData()))
  64.             return True
  65.         
  66.         return super(DemoCustomEventself).event(evt)
  67.     '''
  68.     
  69. if __name__ == '__main__':
  70.     app = QApplication(sys.argv)
  71.     window = DemoCustomEvent()
  72.     window.show()
  73.     sys.exit(app.exec()) 

运行效果如下图:

实战PyQt5: 103-自定义事件

自定义事件测试

本文知识点

  • 创建自定义事件的步骤;
  • sendEvent()和postEvent()的差异。

前一篇: 实战PyQt5: 102-使用事件过滤器

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/838870
推荐阅读
相关标签
  

闽ICP备14008679号