@@ -136,6 +136,7 @@ def _cleanup(self):
136
136
except (TypeError , RuntimeError ): # pragma: no cover
137
137
# already disconnected by Qt?
138
138
pass
139
+ self ._signals = []
139
140
140
141
141
142
class MultiSignalBlocker (_AbstractSignalBlocker ):
@@ -155,6 +156,7 @@ class MultiSignalBlocker(_AbstractSignalBlocker):
155
156
def __init__ (self , timeout = 1000 , raising = False ):
156
157
super (MultiSignalBlocker , self ).__init__ (timeout , raising = raising )
157
158
self ._signals = {}
159
+ self ._slots = {}
158
160
159
161
def _add_signal (self , signal ):
160
162
"""
@@ -164,7 +166,9 @@ def _add_signal(self, signal):
164
166
:param signal: QtCore.Signal
165
167
"""
166
168
self ._signals [signal ] = False
167
- signal .connect (functools .partial (self ._signal_emitted , signal ))
169
+ slot = functools .partial (self ._signal_emitted , signal )
170
+ self ._slots [signal ] = slot
171
+ signal .connect (slot )
168
172
169
173
def _signal_emitted (self , signal ):
170
174
"""
@@ -176,13 +180,22 @@ def _signal_emitted(self, signal):
176
180
self ._signals [signal ] = True
177
181
if all (self ._signals .values ()):
178
182
try :
179
- # of course setting signal_triggered can't raise, but
180
- # leave this try/finally here as a reminder for future
181
- # additions
182
183
self .signal_triggered = True
184
+ self ._cleanup ()
183
185
finally :
184
186
self ._loop .quit ()
185
187
188
+ def _cleanup (self ):
189
+ super (MultiSignalBlocker , self )._cleanup ()
190
+ for signal , slot in self ._slots .items ():
191
+ try :
192
+ signal .disconnect (slot )
193
+ except (TypeError , RuntimeError ): # pragma: no cover
194
+ # already disconnected by Qt?
195
+ pass
196
+ self ._signals .clear ()
197
+ self ._slots .clear ()
198
+
186
199
187
200
class SignalTimeoutError (Exception ):
188
201
"""
0 commit comments