Saltar a contenido

Docks flotantes QDockWidget

El último componente que nos falta ver de las ventanas principales son los docks floatantes.

Los docks son contenedores flotantes que se pueden posicionar a los lados de la ventana, desacoplarlos e incluso cerrarlos.

Al igual que la ventana principal tiene su método para establecer un widget principal, los docks tiene un método setWidget para configurar el widget que contendrán. Nuestra clase Caja es muy simple y nos permitirá hacernos una idea del funcionamiento, así que vamos a recuperarla para utilizarla de widget de los docks:

from PySide6.QtWidgets import (
    QApplication, QMainWindow, QMessageBox, QStatusBar,
    QToolBar, QLabel, QDockWidget)  # edited

class Caja(QLabel):
    def __init__(self, color):
        super().__init__()
        self.setStyleSheet(f"background-color:{color}")

class MainWindow(QMainWindow):
    def __init__(self):
        # ...
        # añadimos los docks
        self.construir_docks()
        # creamos una caja como widget central de la ventana principal
        self.setCentralWidget(Caja("gray"))

    def construir_docks(self):
        # creamos un dock
        dock1 = QDockWidget()
        # le damos un título (optativo)
        dock1.setWindowTitle("DOCK 1")
        # establecemos el widget que contendrá
        dock1.setWidget(Caja("green"))
        # ancho mínimo (optativo)
        dock1.setMinimumWidth(100)
        # lo añadimos en una posición de la ventana principal
        self.addDockWidget(Qt.LeftDockWidgetArea, dock1)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

Como véis los docks son super flexibles. Eso sí, al cerrarlo lo perdemos y deberíamos proveer de alguna forma de crearlo de nuevo, o también podemos limitar sus características :

dock1.setFeatures(
    QDockWidget.NoDockWidgetFeatures | QDockWidget.DockWidgetFloatable |
    QDockWidget.DockWidgetClosable | QDockWidget.DockWidgetMovable)

También podemos controlar su tamaños:

# tamaños (optativos)
dock1.setMinimumWidth(125)
dock1.setMinimumHeight(100)
dock1.setMinimumSize(125, 100)

Y añadir más docks en otras posiciones para juguetear con ellos:

# creamos más docks para jugar con ellos
dock2 = QDockWidget()
dock2.setWindowTitle("DOCK 2")
dock2.setWidget(Caja("yellow"))
dock2.setMinimumSize(125, 100)
self.addDockWidget(Qt.RightDockWidgetArea, dock2)

dock3 = QDockWidget()
dock3.setWindowTitle("DOCK 3")
dock3.setWidget(Caja("blue"))
dock3.setMinimumSize(125, 100)
self.addDockWidget(Qt.BottomDockWidgetArea, dock3)

Fijaros como podemos acoplar widgets unos sobre otrossi hay suficiente espacio o apilarlos usando pestañas, dan muchísimo juego.


Última edición: 22 de Marzo de 2021