From fa642aaf49f6866a7a2317dbaff47b25a6eaac2a Mon Sep 17 00:00:00 2001 From: wakonig_k Date: Sat, 30 Aug 2025 08:54:03 +0200 Subject: [PATCH] fix: process all deletion events before applying a new theme. Note: this can be dropped once qthemes is updated. --- bec_widgets/utils/colors.py | 8 ++++++++ tests/unit_tests/conftest.py | 7 +++++++ 2 files changed, 15 insertions(+) diff --git a/bec_widgets/utils/colors.py b/bec_widgets/utils/colors.py index 6f58b10d..34af4b82 100644 --- a/bec_widgets/utils/colors.py +++ b/bec_widgets/utils/colors.py @@ -7,6 +7,7 @@ import numpy as np import pyqtgraph as pg from bec_qthemes import apply_theme as apply_theme_global from pydantic_core import PydanticCustomError +from qtpy.QtCore import QEvent, QEventLoop from qtpy.QtGui import QColor from qtpy.QtWidgets import QApplication @@ -38,11 +39,18 @@ def get_accent_colors() -> AccentColors | None: return QApplication.instance().theme.accent_colors +def process_all_deferred_deletes(qapp): + qapp.sendPostedEvents(None, QEvent.DeferredDelete) + qapp.processEvents(QEventLoop.AllEvents) + + def apply_theme(theme: Literal["dark", "light"]): """ Apply the theme via the global theming API. This updates QSS, QPalette, and pyqtgraph globally. """ + process_all_deferred_deletes(QApplication.instance()) apply_theme_global(theme) + process_all_deferred_deletes(QApplication.instance()) class Colors: diff --git a/tests/unit_tests/conftest.py b/tests/unit_tests/conftest.py index 6eb093e9..bfd7ddb6 100644 --- a/tests/unit_tests/conftest.py +++ b/tests/unit_tests/conftest.py @@ -8,6 +8,7 @@ from bec_lib import messages from bec_lib.messages import _StoredDataInfo from bec_qthemes import apply_theme from pytestqt.exceptions import TimeoutError as QtBotTimeoutError +from qtpy.QtCore import QEvent, QEventLoop from qtpy.QtWidgets import QApplication, QMessageBox from bec_widgets.cli.rpc.rpc_register import RPCRegister @@ -24,9 +25,15 @@ def pytest_runtest_makereport(item, call): item.stash["failed"] = rep.failed +def process_all_deferred_deletes(qapp): + qapp.sendPostedEvents(None, QEvent.DeferredDelete) + qapp.processEvents(QEventLoop.AllEvents) + + @pytest.fixture(autouse=True) def qapplication(qtbot, request, testable_qtimer_class): # pylint: disable=unused-argument qapp = QApplication.instance() + process_all_deferred_deletes(qapp) apply_theme("light") qapp.processEvents()