Tabs der LNO-Docks in Scroll-Bereich packen (#104)
Ein langer Tab (Druck-Tab mit aufgeklapptem Basemap-Bereich) schob den unteren Rand des QGIS-Fensters aus dem Bildschirm, weil Qt für das Dock die Höhe des höchsten Tabs verlangt. BaseDockWidget.setWidget packt jetzt jeden Tab eines QTabWidget in einen QScrollArea; das wirkt auch für Fachplugins, die ihre Tabs selbst aufbauen. QScrollArea/QFrame im qt_wrapper ergänzt. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
+48
-1
@@ -9,6 +9,8 @@ from sn_basis.functions.message_wrapper import warning, error
|
||||
from sn_basis.functions.qt_wrapper import (
|
||||
QDockWidget,
|
||||
QTabWidget,
|
||||
QScrollArea,
|
||||
FrameNoFrame,
|
||||
Qt,
|
||||
DockWidgetMovable,
|
||||
DockWidgetFloatable,
|
||||
@@ -18,6 +20,36 @@ from sn_basis.functions.qt_wrapper import (
|
||||
)
|
||||
|
||||
|
||||
def _inhalt(seite):
|
||||
"""Tab-Instanz einer Reiterseite; liegt sie in einem Scroll-Bereich, dessen Inhalt."""
|
||||
if isinstance(seite, QScrollArea):
|
||||
return seite.widget()
|
||||
return seite
|
||||
|
||||
|
||||
def tabs_mit_scrollbereich(tab_widget) -> None:
|
||||
"""Packt jeden Tab eines QTabWidget in einen mitwachsenden Scroll-Bereich (Basis #104).
|
||||
|
||||
Ohne Scroll-Bereich verlangt Qt für das Dock mindestens die Höhe des höchsten Tabs; ist
|
||||
der Tab höher als der Bildschirm, schiebt QGIS seinen unteren Fensterrand aus dem Bild.
|
||||
Tabs, die schon in einem Scroll-Bereich liegen, bleiben unverändert.
|
||||
"""
|
||||
if not callable(getattr(tab_widget, "count", None)) or not callable(getattr(tab_widget, "insertTab", None)):
|
||||
return
|
||||
aktuell = tab_widget.currentIndex()
|
||||
for index in range(tab_widget.count()):
|
||||
seite = tab_widget.widget(index)
|
||||
if seite is None or isinstance(seite, QScrollArea):
|
||||
continue
|
||||
titel = tab_widget.tabText(index)
|
||||
bereich = QScrollArea()
|
||||
bereich.setWidgetResizable(True)
|
||||
bereich.setFrameShape(FrameNoFrame)
|
||||
tab_widget.removeTab(index)
|
||||
bereich.setWidget(seite)
|
||||
tab_widget.insertTab(index, bereich, titel)
|
||||
tab_widget.setCurrentIndex(aktuell)
|
||||
|
||||
|
||||
class BaseDockWidget(QDockWidget):
|
||||
"""
|
||||
@@ -26,6 +58,8 @@ class BaseDockWidget(QDockWidget):
|
||||
- Titel wird automatisch aus base_title + subtitle erzeugt
|
||||
- Tabs werden dynamisch aus der Klassenvariable 'tabs' erzeugt
|
||||
- Die zugehörige Toolbar-Action wird beim Schließen zurückgesetzt
|
||||
- Jeder Tab liegt in einem Scroll-Bereich (``setWidget``), auch wenn ein Fachplugin
|
||||
seine Tabs selbst aufbaut (Basis #104)
|
||||
"""
|
||||
|
||||
base_title = "LNO Sachsen"
|
||||
@@ -90,6 +124,19 @@ class BaseDockWidget(QDockWidget):
|
||||
str(e),
|
||||
)
|
||||
|
||||
# ---------------------------------------------------------
|
||||
# Inhalt setzen
|
||||
# ---------------------------------------------------------
|
||||
|
||||
def setWidget(self, widget):
|
||||
"""Wie ``QDockWidget.setWidget``; die Tabs eines QTabWidget bekommen je einen Scroll-Bereich."""
|
||||
if widget is not None:
|
||||
try:
|
||||
tabs_mit_scrollbereich(widget)
|
||||
except Exception as e:
|
||||
warning("Scroll-Bereich konnte nicht angelegt werden", str(e))
|
||||
super().setWidget(widget)
|
||||
|
||||
# ---------------------------------------------------------
|
||||
# Dock schließen
|
||||
# ---------------------------------------------------------
|
||||
@@ -103,7 +150,7 @@ class BaseDockWidget(QDockWidget):
|
||||
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)
|
||||
tab = _inhalt(tab_widget.widget(index))
|
||||
cleanup = getattr(tab, "cleanup", None)
|
||||
if callable(cleanup):
|
||||
try:
|
||||
|
||||
Reference in New Issue
Block a user