diff --git a/README.md b/README.md index 5e95135..e288e97 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ - [1.21 仿QQ设置面板](仿QQ设置面板/) - [1.22 Json生成QTreeWidget](Json生成QTreeWidget/) + ### [2.QGraphicsView练习](QGraphicsView练习/) - [2.1 世界地图](QGraphicsView练习/世界地图) - [2.2 添加QWidget](QGraphicsView练习/添加QWidget.py) diff --git a/partner_625781186/3.机制讲解/3.1 自定义事件/3.1.1 原理/myEvent.py b/partner_625781186/3.机制讲解/3.1 自定义事件/3.1.1 原理/myEvent.py new file mode 100644 index 0000000..bed905c --- /dev/null +++ b/partner_625781186/3.机制讲解/3.1 自定义事件/3.1.1 原理/myEvent.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +''' +@resource:http://blog.csdn.net/zzwdkxx/article/details/39338429 +@description: 自定义QEvent事件,上面网址为C++版本原理解释,此篇为python改编 +@Created on 2018年3月22日 +@email: 625781186@qq.com +''' + +from PyQt5 import QtGui, QtWidgets, QtCore +from PyQt5.QtCore import * +from PyQt5.QtGui import * +from PyQt5.QtWidgets import * + + +MyEventType = QEvent.registerEventType(QEvent.User+100) + +#//长官 + +class MyEvent (QEvent): + def __init__(self, *args, **kwargs): + super(MyEvent, self).__init__(*args, **kwargs) + print(MyEventType) + def QEvent(self,MyEventType): + pass + +#//信使 + +class MySender(QCoreApplication): + + def __init__(self, *args, **kwargs): + super(MySender, self).__init__(*args, **kwargs) + def notify(self, receiver, event): + + if(event.type() == MyEventType): + + print("MyEventType is coming!") + # //return true; + # /*这里不能return true,因为重写notify就是在事件被向下传递之前截住它, + # 随便搞它,搞完了还得给QCoreApplication::notify向下传递,除非在mySender.notify + # 实现了事件向下传递的那一套。直接返回的话myArmy就收不到这个事件,因为执行完这个 + # mySender.notify的return true后,事件传递被人为的在半截终止了 + # (见Qt事件处理的五个层次http:#//blog.csdn.net/michealtx/article/details/6865891 ) + # ,下面的myArmy的安装的过滤器和它自己的event都不会收到这个事件,更甭提最后干活 + # 的myEventHandler了。所以在主函数中执行完mySender.sendEvent把myEvent + # 交给mySender.notify这个败家子儿后,就执行mySender.exec进入其它事件的循环了。这就是 + # 问题http:#//topic.csdn.net/u/20111012/19/78036d16-c163-40f9-a05c-3b7d6f4e9043.html + # 出现的原因。感谢1+1=2大牛!非常感谢! + # */ + + return QCoreApplication.notify(self,receiver, event) + +#//军队 + +class MyArmy (QWidget): + + def MyEventHandler(self,event): + + print("The event is being handled!") + event.accept() + + def event(self, event): + + if(event.type() == MyEventType): + + print("event() is dispathing MyEvent") + self.MyEventHandler(event) # //调用事件处理函数 + if(event.isAccepted()): + + print("The event has been handled!") + return True + return QObject. event(self,event) + + +#//监控者 + +class MyWatcher (QObject): + + def eventFilter(self,watched, event): + + if(event.type() == MyEventType): + + print("I don't wanna filter MyEventType") + return False + + return QObject.eventFilter(self,watched, event) + + +if __name__ == "__main__": + import sys + #//QCoreApplication a(argc, argv); + app = QtWidgets.QApplication(sys.argv) + mySender = MySender(sys.argv) + + myArmy=MyArmy () + myWatcher=MyWatcher () + myArmy.installEventFilter(myWatcher) # //安装事件过滤器 + + myEvent=MyEvent (MyEventType) + mySender.sendEvent( myArmy, myEvent) + mySender.exec()