103 lines
3.2 KiB
Python
103 lines
3.2 KiB
Python
|
#!/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()
|