Skip to content

Commit 1a4e8bb

Browse files
committed
3.自定义事件原理
1 parent 4228f0b commit 1a4e8bb

File tree

1 file changed

+102
-0
lines changed
  • partner_625781186/3.机制讲解/3.1 自定义事件/3.1.1 原理

1 file changed

+102
-0
lines changed
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
4+
'''
5+
@resource:http://blog.csdn.net/zzwdkxx/article/details/39338429
6+
@description: 自定义QEvent事件,上面网址为C++版本原理解释,此篇为python改编
7+
@Created on 2018年3月22日
8+
@email: 625781186@qq.com
9+
'''
10+
11+
from PyQt5 import QtGui, QtWidgets, QtCore
12+
from PyQt5.QtCore import *
13+
from PyQt5.QtGui import *
14+
from PyQt5.QtWidgets import *
15+
16+
17+
MyEventType = QEvent.registerEventType(QEvent.User+100)
18+
19+
#//长官
20+
21+
class MyEvent (QEvent):
22+
def __init__(self, *args, **kwargs):
23+
super(MyEvent, self).__init__(*args, **kwargs)
24+
print(MyEventType)
25+
def QEvent(self,MyEventType):
26+
pass
27+
28+
#//信使
29+
30+
class MySender(QCoreApplication):
31+
32+
def __init__(self, *args, **kwargs):
33+
super(MySender, self).__init__(*args, **kwargs)
34+
def notify(self, receiver, event):
35+
36+
if(event.type() == MyEventType):
37+
38+
print("MyEventType is coming!")
39+
# //return true;
40+
# /*这里不能return true,因为重写notify就是在事件被向下传递之前截住它,
41+
# 随便搞它,搞完了还得给QCoreApplication::notify向下传递,除非在mySender.notify
42+
# 实现了事件向下传递的那一套。直接返回的话myArmy就收不到这个事件,因为执行完这个
43+
# mySender.notify的return true后,事件传递被人为的在半截终止了
44+
# (见Qt事件处理的五个层次http:#//blog.csdn.net/michealtx/article/details/6865891 )
45+
# ,下面的myArmy的安装的过滤器和它自己的event都不会收到这个事件,更甭提最后干活
46+
# 的myEventHandler了。所以在主函数中执行完mySender.sendEvent把myEvent
47+
# 交给mySender.notify这个败家子儿后,就执行mySender.exec进入其它事件的循环了。这就是
48+
# 问题http:#//topic.csdn.net/u/20111012/19/78036d16-c163-40f9-a05c-3b7d6f4e9043.html
49+
# 出现的原因。感谢1+1=2大牛!非常感谢!
50+
# */
51+
52+
return QCoreApplication.notify(self,receiver, event)
53+
54+
#//军队
55+
56+
class MyArmy (QWidget):
57+
58+
def MyEventHandler(self,event):
59+
60+
print("The event is being handled!")
61+
event.accept()
62+
63+
def event(self, event):
64+
65+
if(event.type() == MyEventType):
66+
67+
print("event() is dispathing MyEvent")
68+
self.MyEventHandler(event) # //调用事件处理函数
69+
if(event.isAccepted()):
70+
71+
print("The event has been handled!")
72+
return True
73+
return QObject. event(self,event)
74+
75+
76+
#//监控者
77+
78+
class MyWatcher (QObject):
79+
80+
def eventFilter(self,watched, event):
81+
82+
if(event.type() == MyEventType):
83+
84+
print("I don't wanna filter MyEventType")
85+
return False
86+
87+
return QObject.eventFilter(self,watched, event)
88+
89+
90+
if __name__ == "__main__":
91+
import sys
92+
#//QCoreApplication a(argc, argv);
93+
app = QtWidgets.QApplication(sys.argv)
94+
mySender = MySender(sys.argv)
95+
96+
myArmy=MyArmy ()
97+
myWatcher=MyWatcher ()
98+
myArmy.installEventFilter(myWatcher) # //安装事件过滤器
99+
100+
myEvent=MyEvent (MyEventType)
101+
mySender.sendEvent( myArmy, myEvent)
102+
mySender.exec()

0 commit comments

Comments
 (0)