exit_Crash_fix
Release Plugin / release (push) Successful in 4s

This commit is contained in:
2026-04-20 13:28:00 +02:00
parent d762f2d94f
commit 88761eab22
4 changed files with 94 additions and 24 deletions
+43
View File
@@ -171,3 +171,46 @@ def setup_verfahrensgebiet_listener() -> None:
except Exception:
pass
def teardown_verfahrensgebiet_listener() -> None:
"""
Trennt globale Event-Listener vom QgsProject-Singleton.
Diese Funktion ist idempotent und kann mehrfach aufgerufen werden.
"""
global _listener_installed
if not _listener_installed:
return
try:
project = QgsProject.instance()
if project is None:
return
try:
project.layersAdded.disconnect(_on_layers_added)
except Exception:
pass
try:
project.layerRemoved.disconnect(_on_layer_removed)
except Exception:
pass
for signal_name in ("readProject", "newProjectCreated", "cleared"):
signal = getattr(project, signal_name, None)
if signal is None:
continue
try:
signal.disconnect(_on_project_changed)
except Exception:
pass
except RuntimeError:
pass
except Exception:
pass
finally:
_listener_installed = False
+6 -1
View File
@@ -4,7 +4,10 @@ from qgis.utils import plugins
from sn_basis.functions.qt_wrapper import QCoreApplication
from sn_basis.functions.sys_wrapper import getattr_safe
from sn_basis.functions.verfahrensgebiet_manager import setup_verfahrensgebiet_listener
from sn_basis.functions.verfahrensgebiet_manager import (
setup_verfahrensgebiet_listener,
teardown_verfahrensgebiet_listener,
)
from sn_basis.ui.navigation import Navigation
@@ -53,6 +56,8 @@ class BasisPlugin:
"""
Räumt UI-Komponenten sauber auf.
"""
teardown_verfahrensgebiet_listener()
if self.ui:
self.ui.remove_all()
self.ui = None
+14
View File
@@ -99,6 +99,20 @@ class BaseDockWidget(QDockWidget):
Wird aufgerufen, wenn das Dock geschlossen wird.
Setzt die zugehörige Toolbar-Action zurück.
"""
try:
tab_widget = self.widget()
if tab_widget and hasattr(tab_widget, "count") and hasattr(tab_widget, "widget"):
for index in range(tab_widget.count()):
tab = tab_widget.widget(index)
cleanup = getattr(tab, "cleanup", None)
if callable(cleanup):
try:
cleanup()
except Exception:
pass
except Exception:
pass
try:
if self.action:
self.action.setChecked(False)
+31 -23
View File
@@ -13,7 +13,10 @@ from sn_basis.functions.qt_wrapper import (
QCheckBox,
QHBoxLayout,
QPushButton,
QCoreApplication,
QToolButton,
ToolButtonTextBesideIcon,
ArrowDown,
ArrowRight,
)
from sn_basis.functions.qgiscore_wrapper import QgsProject, QgsMapLayerProxyModel
from sn_basis.functions.qgisui_wrapper import iface, QgsMapLayerComboBox
@@ -88,13 +91,6 @@ 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
@@ -442,26 +438,38 @@ 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()
def _disconnect_project_signals(self) -> None:
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
return
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
def cleanup(self) -> None:
"""Trennt Signalverbindungen vor dem Schliessen des Tabs."""
self._disconnect_theme_collection_signals()
self._disconnect_project_signals()
def _connect_project_signals(self) -> None:
project = QgsProject.instance()
try:
project = QgsProject.instance()
except Exception:
return
if project is None:
return
for signal_name in ("readProject", "newProjectCreated", "cleared"):
signal = getattr(project, signal_name, None)
if signal is None: