@@ -136,6 +136,7 @@ def _cleanup(self):
136136 except (TypeError , RuntimeError ): # pragma: no cover
137137 # already disconnected by Qt?
138138 pass
139+ self ._signals = []
139140
140141
141142class MultiSignalBlocker (_AbstractSignalBlocker ):
@@ -155,6 +156,7 @@ class MultiSignalBlocker(_AbstractSignalBlocker):
155156 def __init__ (self , timeout = 1000 , raising = False ):
156157 super (MultiSignalBlocker , self ).__init__ (timeout , raising = raising )
157158 self ._signals = {}
159+ self ._slots = {}
158160
159161 def _add_signal (self , signal ):
160162 """
@@ -164,7 +166,9 @@ def _add_signal(self, signal):
164166 :param signal: QtCore.Signal
165167 """
166168 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 )
168172
169173 def _signal_emitted (self , signal ):
170174 """
@@ -176,13 +180,22 @@ def _signal_emitted(self, signal):
176180 self ._signals [signal ] = True
177181 if all (self ._signals .values ()):
178182 try :
179- # of course setting signal_triggered can't raise, but
180- # leave this try/finally here as a reminder for future
181- # additions
182183 self .signal_triggered = True
184+ self ._cleanup ()
183185 finally :
184186 self ._loop .quit ()
185187
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+
186199
187200class SignalTimeoutError (Exception ):
188201 """
0 commit comments