Skip to content

Commit 86e41e3

Browse files
committed
Implement proper clean up for MultiSignalBlocker
1 parent 3241de5 commit 86e41e3

File tree

1 file changed

+17
-4
lines changed

1 file changed

+17
-4
lines changed

pytestqt/wait_signal.py

+17-4
Original file line numberDiff line numberDiff line change
@@ -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

141142
class 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

187200
class SignalTimeoutError(Exception):
188201
"""

0 commit comments

Comments
 (0)