Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 5ad94f2

Browse files
Merge branch 'master' into master
2 parents 5c06b26 + 780e19a commit 5ad94f2

File tree

2 files changed

+103
-0
lines changed

2 files changed

+103
-0
lines changed

‎README.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
- [1.21 仿QQ设置面板](仿QQ设置面板/)
2929
- [1.22 Json生成QTreeWidget](Json生成QTreeWidget/)
3030

31+
3132
### [2.QGraphicsView练习](QGraphicsView练习/)
3233
- [2.1 世界地图](QGraphicsView练习/世界地图)
3334
- [2.2 添加QWidget](QGraphicsView练习/添加QWidget.py)
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)

AltStyle によって変換されたページ (->オリジナル) /