diff --git a/bec_widgets/utils/bec_connector.py b/bec_widgets/utils/bec_connector.py index 91d53e33..8c225fe1 100644 --- a/bec_widgets/utils/bec_connector.py +++ b/bec_widgets/utils/bec_connector.py @@ -8,6 +8,7 @@ import uuid from datetime import datetime from typing import TYPE_CHECKING, Optional +import shiboken6 as shb from bec_lib.logger import bec_logger from bec_lib.utils.import_utils import lazy_import_from from pydantic import BaseModel, Field, field_validator @@ -230,23 +231,21 @@ class BECConnector: - If there's a nearest BECConnector parent, only compare with children of that parent. - If parent is None (i.e., top-level object), compare with all other top-level BECConnectors. """ + if not shb.isValid(self): + return + QApplication.sendPostedEvents() parent_bec = WidgetHierarchy._get_becwidget_ancestor(self) if parent_bec: # We have a parent => only compare with siblings under that parent - siblings = parent_bec.findChildren(BECConnector) + siblings = [sib for sib in parent_bec.findChildren(BECConnector) if shb.isValid(sib)] else: # No parent => treat all top-level BECConnectors as siblings - # 1) Gather all BECConnectors from QApplication - all_widgets = QApplication.allWidgets() - all_bec = [w for w in all_widgets if isinstance(w, BECConnector)] - # 2) "Top-level" means closest BECConnector parent is None - top_level_bec = [ - w for w in all_bec if WidgetHierarchy._get_becwidget_ancestor(w) is None - ] - # 3) We are among these top-level siblings - siblings = top_level_bec + # Use RPCRegister to avoid QApplication.allWidgets() during event processing. + connections = self.rpc_register.list_all_connections().values() + all_bec = [w for w in connections if isinstance(w, BECConnector) and shb.isValid(w)] + siblings = [w for w in all_bec if WidgetHierarchy._get_becwidget_ancestor(w) is None] # Collect used names among siblings used_names = {sib.objectName() for sib in siblings if sib is not self}