@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user