QGIS-Layer-List-Sichtbarkeit-Signal verbunden

This commit is contained in:
Patrick Haßel 2025-09-28 17:37:18 +02:00
parent acd0c8d888
commit 0f8730db7f
2 changed files with 66 additions and 13 deletions

View File

@ -2,5 +2,3 @@
Beim Hinzufügen von Features fehlte das layer.updateFields() Beim Hinzufügen von Features fehlte das layer.updateFields()
Beim Hinzufügen von Features fehlte wurde versucht eine viel zu große Pegelonline 'number' in einen Int zu stecken. War schwierig zu entdecken => provider.errors() Beim Hinzufügen von Features fehlte wurde versucht eine viel zu große Pegelonline 'number' in einen Int zu stecken. War schwierig zu entdecken => provider.errors()
DockWidget wurde in der Höhe ziemlich voll → Weiteres Widget nur für Grafen DockWidget wurde in der Höhe ziemlich voll → Weiteres Widget nur für Grafen
(De-)Selekt aus Layer-Liste mitbekommen

View File

@ -2,7 +2,7 @@ import os.path
from typing import Callable from typing import Callable
from PyQt5 import QtGui from PyQt5 import QtGui
from PyQt5.QtWidgets import QAction from PyQt5.QtWidgets import QAction, QCheckBox
from qgis._core import QgsVectorLayer, QgsProject, QgsLayerTreeLayer, QgsPalLayerSettings, QgsVectorLayerSimpleLabeling, QgsStyle, QgsSymbol, QgsRendererCategory, QgsCategorizedSymbolRenderer from qgis._core import QgsVectorLayer, QgsProject, QgsLayerTreeLayer, QgsPalLayerSettings, QgsVectorLayerSimpleLabeling, QgsStyle, QgsSymbol, QgsRendererCategory, QgsCategorizedSymbolRenderer
from .map_tips import WATERLEVELS_MAP_TIPS, STATIONS_MAP_TIPS, BASEMAP_MAP_TIPS from .map_tips import WATERLEVELS_MAP_TIPS, STATIONS_MAP_TIPS, BASEMAP_MAP_TIPS
@ -77,9 +77,11 @@ class PoRunner(object):
:param disconnect: Methode die Aufgerufen wird, wenn der Layer gelöscht wird :param disconnect: Methode die Aufgerufen wird, wenn der Layer gelöscht wird
:type disconnect: Callable[[], None] :type disconnect: Callable[[], None]
:param map_tips: HTML Code für die QGIS-Map-Tips :param map_tips: HTML Code für die QGIS-Map-Tips
:param checkbox: Sichtbarkeit-Checkbox um sie via Signal upzudaten
:type checkbox: QCheckBox
""" """
def _basemap_create(self, path, name, disconnect: Callable[[], None], map_tips) -> None | QgsVectorLayer: def _basemap_create(self, path, name, disconnect: Callable[[], None], map_tips, checkbox) -> None | QgsVectorLayer:
print("_basemap_create: %s" % (name,)) print("_basemap_create: %s" % (name,))
path = os.path.join(self.local_dir, "basemap", path) path = os.path.join(self.local_dir, "basemap", path)
basemap = QgsVectorLayer(path, name, "ogr") basemap = QgsVectorLayer(path, name, "ogr")
@ -102,6 +104,9 @@ class PoRunner(object):
layer_tree = self.iface.layerTreeCanvasBridge().rootGroup() layer_tree = self.iface.layerTreeCanvasBridge().rootGroup()
layer_tree.insertChildNode(-1, QgsLayerTreeLayer(basemap)) # am unteren Ende anhängen → liegt somit unter stations/waterlevels layer_tree.insertChildNode(-1, QgsLayerTreeLayer(basemap)) # am unteren Ende anhängen → liegt somit unter stations/waterlevels
# Signal zur Erkennung von Sichtbarkeitsänderungen verbinden
self._connect_layer_list_visibility_signal(basemap, checkbox)
return basemap return basemap
""" """
@ -122,8 +127,14 @@ class PoRunner(object):
print("_cbBasemapLines_toggled: %s" % (checked,)) print("_cbBasemapLines_toggled: %s" % (checked,))
if self.lines is None and checked: if self.lines is None and checked:
# Flüsse sind noch nicht als Layer angelegt → Anlegen # Flüsse sind noch nicht als Layer geladen → Laden
self.lines = self._basemap_create("waters.gpkg|layername=water_l", "Flüsse", self._basemap_disconnect_lines, BASEMAP_MAP_TIPS) self.lines = self._basemap_create(
"waters.gpkg|layername=water_l",
"Flüsse",
self._basemap_disconnect_lines,
BASEMAP_MAP_TIPS,
self.ui.cbBasemapLines,
)
if self.lines is not None: if self.lines is not None:
# Flüsse sind (bereits) angelegt → setze Sichtbarkeit wie gefordert # Flüsse sind (bereits) angelegt → setze Sichtbarkeit wie gefordert
@ -139,8 +150,14 @@ class PoRunner(object):
print("_cbBasemapAreas_toggled: %s" % (checked,)) print("_cbBasemapAreas_toggled: %s" % (checked,))
if self.areas is None and checked: if self.areas is None and checked:
# Flächen sind noch nicht als Layer angelegt → Anlegen # Flächen sind noch nicht als Layer geladen → Laden
self.areas = self._basemap_create("waters.gpkg|layername=water_f", "Flächen", self._basemap_disconnect_areas, BASEMAP_MAP_TIPS) self.areas = self._basemap_create(
"waters.gpkg|layername=water_f",
"Flächen",
self._basemap_disconnect_areas,
BASEMAP_MAP_TIPS,
self.ui.cbBasemapAreas,
)
if self.areas is not None: if self.areas is not None:
# Flächen sind (bereits) angelegt → setze Sichtbarkeit wie gefordert # Flächen sind (bereits) angelegt → setze Sichtbarkeit wie gefordert
@ -232,11 +249,11 @@ class PoRunner(object):
print("_cbStationsVisible_toggled: %s" % (visible,)) print("_cbStationsVisible_toggled: %s" % (visible,))
if self.stations is None and visible: if self.stations is None and visible:
# Stationen sind noch nicht als Layer angelegt → Anlegen # Stationen sind noch nicht als Layer geladen → Laden
reader = PoStationReaderQgs() reader = PoStationReaderQgs()
features = reader.get_features() features = reader.get_features()
self.stations = self._layer_create_from_features(reader.fields, reader.crs, features, "Stationen", STATIONS_MAP_TIPS) self.stations = self._layer_create_from_features(reader.fields, reader.crs, features, "Stationen", STATIONS_MAP_TIPS)
self._layer_add_to_instance(self.stations, self._stations_disconnect) self._layer_add_to_instance(self.stations, self._stations_disconnect, self.ui.cbStationsVisible)
if self.stations is not None: if self.stations is not None:
# Stationen sind (bereits) angelegt → setze Sichtbarkeit wie gefordert # Stationen sind (bereits) angelegt → setze Sichtbarkeit wie gefordert
@ -402,11 +419,11 @@ class PoRunner(object):
print("_cbWaterlevelsVisible_toggled: %s" % (visible,)) print("_cbWaterlevelsVisible_toggled: %s" % (visible,))
if self.waterlevels is None and visible: if self.waterlevels is None and visible:
# Pegelstände sind noch nicht als Layer angelegt → Anlegen # Pegelstände sind noch nicht als Layer geladen → Laden
reader = PoWaterlevelReaderQgs() reader = PoWaterlevelReaderQgs()
features = reader.get_features() features = reader.get_features()
self.waterlevels = self._layer_create_from_features(reader.fields, reader.crs, features, "Pegelstände", WATERLEVELS_MAP_TIPS) self.waterlevels = self._layer_create_from_features(reader.fields, reader.crs, features, "Pegelstände", WATERLEVELS_MAP_TIPS)
self._layer_add_to_instance(self.waterlevels, self.waterlevels_disconnect) self._layer_add_to_instance(self.waterlevels, self.waterlevels_disconnect, self.ui.cbWaterlevelsVisible)
if self.waterlevels is not None: if self.waterlevels is not None:
# Pegelstände sind (bereits) angelegt → setze Sichtbarkeit wie gefordert # Pegelstände sind (bereits) angelegt → setze Sichtbarkeit wie gefordert
@ -603,9 +620,11 @@ class PoRunner(object):
:type layer: QgsVectorLayer :type layer: QgsVectorLayer
:param disconnect: Methode die Aufgerufen wird, wenn der Layer gelöscht wird :param disconnect: Methode die Aufgerufen wird, wenn der Layer gelöscht wird
:type disconnect: Callable[[], None] :type disconnect: Callable[[], None]
:param checkbox: Sichtbarkeit-Checkbox um sie via Signal upzudaten
:type checkbox: QCheckBox
""" """
def _layer_add_to_instance(self, layer: QgsVectorLayer, disconnect: Callable[[], None]): def _layer_add_to_instance(self, layer: QgsVectorLayer, disconnect: Callable[[], None], checkbox: QCheckBox):
print("_layer_add_to_instance") print("_layer_add_to_instance")
if layer is None: if layer is None:
# Kein Layer mitgegeben → Abbruch # Kein Layer mitgegeben → Abbruch
@ -623,6 +642,42 @@ class PoRunner(object):
layer_tree = self.iface.layerTreeCanvasBridge().rootGroup() layer_tree = self.iface.layerTreeCanvasBridge().rootGroup()
layer_tree.insertChildNode(0, QgsLayerTreeLayer(layer)) # am oberen Ende anhängen → liegt somit über basemap layer_tree.insertChildNode(0, QgsLayerTreeLayer(layer)) # am oberen Ende anhängen → liegt somit über basemap
# Signal zur Erkennung von Sichtbarkeitsänderungen verbinden
self._connect_layer_list_visibility_signal(layer, checkbox)
"""
Verbinde das Layer-Sichtbarkeit-Signal der QGIS-Layer-Liste mit unserer Layer-Referenz und unserer Checkbox
:param layer: Zu behandelnder Layer
:type layer: QgsVectorLayer
:param checkbox: Sichtbarkeit-Checkbox um sie via Signal upzudaten
:type checkbox: QCheckBox
"""
def _connect_layer_list_visibility_signal(self, layer, checkbox):
root = QgsProject.instance().layerTreeRoot()
node = root.findLayer(layer.id())
if node:
# Node existiert → Signal verbinden
node.visibilityChanged.connect(lambda: self._layer_set_visible_includingCheckbox(layer, node.isVisible(), checkbox))
print("_layer_add_to_instance: Layer-Sichtbarkeits-Signal verbunden!")
else:
# Node nicht gefunden → ignorieren (Programmierfehler)
print("_layer_add_to_instance: Fehler: Node im Tree nicht gefunden!")
"""
Setzt die Sichtbarkeit des gegebenen Layers (inklusive gegebener Checkbox)
:param layer: Zu behandelnder Layer
:type layer: QgsVectorLayer
:param visible: Sichtbarkeit
:type visible: bool
:param checkbox: Sichtbarkeit-Checkbox um sie via Signal upzudaten
:type checkbox: QCheckBox
"""
def _layer_set_visible_includingCheckbox(self, layer, visible: bool, checkbox: QCheckBox):
checkbox.setChecked(visible)
self._layer_set_visible(layer, visible)
""" """
Aktualisiert die Labels eines Layers Aktualisiert die Labels eines Layers
:param layer: Zu behandelnder Layer :param layer: Zu behandelnder Layer