Compare commits

...
Author SHA1 Message Date
22ottomi 5b4cbc3127 Merge pull request 'fix: Access Violation beim Beenden von QGIS in PrintTab beheben' (#27) from bug/crash_on_exit into unstable
Release Plugin / release (push) Successful in 9s
Reviewed-on: #27
2026-04-17 14:15:56 +02:00
Michael Otto f0944aab99 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.
2026-04-17 14:06:28 +02:00
2 changed files with 33 additions and 5 deletions
+3 -3
View File
@@ -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"]
+30 -2
View File
@@ -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"):