diff --git a/bec_widgets/utils/bec_signal_proxy.py b/bec_widgets/utils/bec_signal_proxy.py index 8c648769..aff6cb17 100644 --- a/bec_widgets/utils/bec_signal_proxy.py +++ b/bec_widgets/utils/bec_signal_proxy.py @@ -22,11 +22,15 @@ def cleanup_signal_proxy(proxy: SignalProxy) -> None: Args: proxy(SignalProxy): The proxy to stop. """ + # A repeated SignalProxy.disconnect makes PySide6 warn "Failed to disconnect". + if getattr(proxy, "_bec_cleaned_up", False): + return # Called explicitly: on subclasses of SignalProxy, PySide6 resolves proxy.disconnect # to the built-in QObject.disconnect instead of SignalProxy.disconnect. SignalProxy.disconnect(proxy) proxy.timer.stop() proxy.args = None + proxy._bec_cleaned_up = True class BECSignalProxy(SignalProxy): diff --git a/tests/unit_tests/test_utils_bec_signal_proxy.py b/tests/unit_tests/test_utils_bec_signal_proxy.py index b093c56e..61f0cc77 100644 --- a/tests/unit_tests/test_utils_bec_signal_proxy.py +++ b/tests/unit_tests/test_utils_bec_signal_proxy.py @@ -1,3 +1,4 @@ +import warnings from unittest import mock import pyqtgraph as pg @@ -256,4 +257,7 @@ def test_cleanup_signal_proxy_stops_queued_delivery(qtbot): assert calls == [] assert ticks == [] assert not proxy.timer.timer.isActive() - cleanup_signal_proxy(proxy) # a second call is a no-op + with warnings.catch_warnings(record=True) as caught: + warnings.simplefilter("always") + cleanup_signal_proxy(proxy) # a second call is a no-op, without PySide warnings + assert [str(w.message) for w in caught] == []