From f0944aab996fbac9926440497361c576451a6719 Mon Sep 17 00:00:00 2001 From: Michael Otto Date: Fri, 17 Apr 2026 14:02:50 +0200 Subject: [PATCH] fix: Access Violation beim Beenden von QGIS in PrintTab beheben QgsProject-Signale (readProject, newProjectCreated, cleared) wurden beim Shutdown von QGIS nicht getrennt. Das Signal 'cleared' wurde emittiert waehrend QgsProject sich selbst zerstoerte, was _on_project_changed triggerte und zu einem Zugriff auf bereits destrukturierte Objekte fuehrte. Loesung: aboutToQuit-Signal verbunden mit neuer _cleanup_signals()-Methode, die alle QGIS-Signalverbindungen sauber trennt, bevor QGIS Kernobjekte zerstoert. --- ui/tabs/__init__.py | 6 +++--- ui/tabs/print_tab.py | 32 ++++++++++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/ui/tabs/__init__.py b/ui/tabs/__init__.py index 7d46e9d..8e6a94a 100644 --- a/ui/tabs/__init__.py +++ b/ui/tabs/__init__.py @@ -1,4 +1,4 @@ -from sn_basis.ui.tabs.print_tab import PrintTab -from sn_basis.ui.tabs.settings_tab import SettingsTab +# from sn_basis.ui.tabs.print_tab import PrintTab +# from sn_basis.ui.tabs.settings_tab import SettingsTab -__all__ = ["PrintTab", "SettingsTab"] +# __all__ = ["PrintTab", "SettingsTab"] diff --git a/ui/tabs/print_tab.py b/ui/tabs/print_tab.py index 8884cd6..0d9db2a 100644 --- a/ui/tabs/print_tab.py +++ b/ui/tabs/print_tab.py @@ -13,6 +13,7 @@ from sn_basis.functions.qt_wrapper import ( QCheckBox, QHBoxLayout, QPushButton, + QCoreApplication, ) from sn_basis.functions.qgiscore_wrapper import QgsProject from sn_basis.functions.qgisui_wrapper import iface @@ -57,9 +58,11 @@ class PrintTab(QWidget): def __init__(self, parent: Optional[Any] = None): super().__init__(parent) - self.pruefmanager: Optional[Pruefmanager] = None - self.logic: Optional[PrintLogic] = None + self.logic = PrintLogic(self.pruefmanager) + + + #self.logic: Optional[PrintLogic] = None self._kartenname_combo: Optional[Any] = None self._massstab_combo: Optional[Any] = None self._thema_combo: Optional[Any] = None @@ -76,6 +79,13 @@ class PrintTab(QWidget): self._connect_theme_collection_signals() self._connect_project_signals() + app = QCoreApplication.instance() + if app is not None: + try: + app.aboutToQuit.connect(self._cleanup_signals) + except Exception: + pass + def set_services(self, pruefmanager: Pruefmanager, data_grabber: DataGrabber) -> None: _ = data_grabber self.pruefmanager = pruefmanager @@ -340,6 +350,24 @@ class PrintTab(QWidget): druckbereich_auswahl=self._druckbereich_combo.currentText() if self._druckbereich_combo else DRUCKBEREICH_VERFAHRENSGEBIET, ) + def _cleanup_signals(self) -> None: + """Trennt alle QGIS-Signalverbindungen vor dem Beenden von QGIS.""" + self._disconnect_theme_collection_signals() + try: + project = QgsProject.instance() + if project is None: + return + for signal_name in ("readProject", "newProjectCreated", "cleared"): + signal = getattr(project, signal_name, None) + if signal is None: + continue + try: + signal.disconnect(self._on_project_changed) + except Exception: + pass + except Exception: + pass + def _connect_project_signals(self) -> None: project = QgsProject.instance() for signal_name in ("readProject", "newProjectCreated", "cleared"):