Viper_7691
Viper_7691

Reputation: 1

PySide2 and Qt Designer: unable to make QGroupBox expand in runtime

I'm a Tkinter user, but I decided to use Qt library, 'cause the final result is more pro. I'm re-coding an old interface, that is populated in runtime based on the contents of an ini file.

IMG starting point:

IMG starting point

But when I do it, the news widgets almost stack ones over the others. If I expand the window manually, the widgets use all the vertical space, but I tried to make them to stay in the top of window.

IMG populated:

IMG populated,

IMG manually resized (only vert allowed):

IMG manually resized (only vert allowed)

That's the Qt Designer UI:

IMG Qt Designer UI

That's the complete code generated by QTD:

################################################################################
# Form generated from reading UI file 'limpia_Hot_Folders 6uSOTvD.ui'
#
# Created by: Qt User Interface Compiler version 5.14.1
#
# WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################

from PySide2.QtCore import (QCoreApplication, QMetaObject, QRect, QSize, Qt)
from PySide2.QtGui import QFont
from PySide2.QtWidgets import *
from PySide2 import QtWidgets


class Ui_MainWindow(object):

    def __init__(self):
        self.actionActualizar = None
        self.actionEditar_Fiery_y_HF = None
        self.actionSalir = None
        self.actionSeleccionar_todo = None
        self.actionInvertir_seleccion = None
        self.actionSeleccionar_nada = None
        self.actionAyuda = None
        self.actionAcerca_de = None
        self.actionPapelera = None
        self.actionPermanente = None
        self.WDT_central = None
        self.gridLayout = None
        self.BTN_vaciar = None
        self.GRB_fierys = None
        self.grid_GRB_fierys = None
        self.RBT_fiery_1 = None
        self.CHB_fiery_1 = None
        self.gridLayout = None
        self.VLS_top = None
        self.VLS_mid = None
        self.HZS_izq = None
        self.HZS_der = None
        self.LBL_flecha = None
        self.GRB_hotfolders = None
        self.vert_lay_GRB_hotfolders = None
        self.CHB_hotfolder_1 = None
        self.VLS_down = None
        self.Menubar = None
        self.menuArchivo = None
        self.menuSeleccion = None
        self.menuAyuda = None
        self.menuModo_Borrado = None

    def setupUi(self, MainWindow):
        if MainWindow.objectName():
            MainWindow.setObjectName("MainWindow")
        MainWindow.resize(420, 170)
        sizePolicy = QSizePolicy(QSizePolicy.Fixed,
                                 QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
        MainWindow.setSizePolicy(sizePolicy)
        MainWindow.setMinimumSize(QSize(420, 170))
        MainWindow.setMaximumSize(QSize(420, 2000))
        MainWindow.setWindowTitle("Limpia Hot Folders")

        self.actionActualizar = QAction(MainWindow)
        self.actionActualizar.setObjectName("actionActualizar")
        self.actionActualizar.setShortcutVisibleInContextMenu(True)

        self.actionEditar_Fiery_y_HF = QAction(MainWindow)
        self.actionEditar_Fiery_y_HF.setObjectName("actionEditar_Fiery_y_HF")

        self.actionSalir = QAction(MainWindow)
        self.actionSalir.setObjectName("actionSalir")

        self.actionSeleccionar_todo = QAction(MainWindow)
        self.actionSeleccionar_todo.setObjectName("actionSeleccionar_todo")

        self.actionInvertir_seleccion = QAction(MainWindow)
        self.actionInvertir_seleccion.setObjectName("actionInvertir_seleccion")

        self.actionSeleccionar_nada = QAction(MainWindow)
        self.actionSeleccionar_nada.setObjectName("actionSeleccionar_nada")

        self.actionAyuda = QAction(MainWindow)
        self.actionAyuda.setObjectName("actionAyuda")

        self.actionAcerca_de = QAction(MainWindow)
        self.actionAcerca_de.setObjectName(u"actionAcerca_de")

        self.actionPapelera = QAction(MainWindow)
        self.actionPapelera.setObjectName("actionPapelera")
        self.actionPapelera.setCheckable(True)

        self.actionPermanente = QAction(MainWindow)
        self.actionPermanente.setObjectName("actionPermanente")
        self.actionPermanente.setCheckable(True)
        self.actionPermanente.setChecked(False)

        self.WDT_central = QWidget(MainWindow)
        self.WDT_central.setObjectName("WDT_central")
        self.WDT_central.setEnabled(True)
        sizePolicy = QSizePolicy(QSizePolicy.Expanding,
                                 QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.WDT_central.sizePolicy().hasHeightForWidth())
        self.WDT_central.setSizePolicy(sizePolicy)
        self.WDT_central.setMaximumSize(QSize(2000, 2000))

        self.gridLayout = QGridLayout(self.WDT_central)
        self.gridLayout.setObjectName("gridLayout")

        self.BTN_vaciar = QPushButton(self.WDT_central)
        self.BTN_vaciar.setObjectName("BTN_vaciar")
        sizePolicy1 = QSizePolicy(QSizePolicy.Minimum,
                                  QSizePolicy.Fixed)
        sizePolicy1.setHorizontalStretch(0)
        sizePolicy1.setVerticalStretch(0)
        sizePolicy1.setHeightForWidth(self.BTN_vaciar.sizePolicy().hasHeightForWidth())
        self.BTN_vaciar.setSizePolicy(sizePolicy1)
        font = QFont()
        font.setPointSize(10)
        self.BTN_vaciar.setFont(font)
        self.gridLayout.addWidget(self.BTN_vaciar,
                                  4,
                                  1,
                                  1,
                                  3)

        self.GRB_fierys = QGroupBox(self.WDT_central)
        self.GRB_fierys.setObjectName("GRB_fierys")
        sizePolicy2 = QSizePolicy(QSizePolicy.Preferred,
                                  QSizePolicy.MinimumExpanding)
        sizePolicy2.setHorizontalStretch(0)
        sizePolicy2.setVerticalStretch(0)
        sizePolicy2.setHeightForWidth(self.GRB_fierys.sizePolicy().hasHeightForWidth())
        self.GRB_fierys.setSizePolicy(sizePolicy2)
        self.GRB_fierys.setMinimumSize(QSize(0, 0))
        font1 = QFont()
        font1.setPointSize(9)
        self.GRB_fierys.setFont(font1)
        self.GRB_fierys.setAlignment(Qt.AlignLeading | Qt.AlignLeft | Qt.AlignTop)
        self.grid_GRB_fierys = QGridLayout(self.GRB_fierys)
        self.grid_GRB_fierys.setObjectName("grid_GRB_fierys")
        self.grid_GRB_fierys.setContentsMargins(20, -1, -1, -1)

        self.gridLayout.addWidget(self.GRB_fierys,
                                  1,
                                  1,
                                  2,
                                  1)

        # Espaciador vertical
        self.VLS_top = QSpacerItem(10,
                                   10,
                                   QSizePolicy.Minimum,
                                   QSizePolicy.Fixed)
        self.gridLayout.addItem(self.VLS_top,
                                0,
                                1,
                                1,
                                3)

        self.VLS_mid = QSpacerItem(20,
                                   10,
                                   QSizePolicy.Minimum,
                                   QSizePolicy.Fixed)
        self.gridLayout.addItem(self.VLS_mid,
                                3,
                                1,
                                1,
                                3)

        # Espaciador horizontal
        self.HZS_izq = QSpacerItem(10,
                                   20,
                                   QSizePolicy.Fixed,
                                   QSizePolicy.Minimum)
        self.gridLayout.addItem(self.HZS_izq,
                                1,
                                0,
                                2,
                                1)

        self.HZS_der = QSpacerItem(10,
                                   20,
                                   QSizePolicy.Fixed,
                                   QSizePolicy.Minimum)
        self.gridLayout.addItem(self.HZS_der,
                                1,
                                4,
                                2,
                                1)

        self.LBL_flecha = QLabel(self.WDT_central)
        self.LBL_flecha.setObjectName("LBL_flecha")
        sizePolicy4 = QSizePolicy(QSizePolicy.Fixed,
                                  QSizePolicy.Preferred)
        sizePolicy4.setHorizontalStretch(0)
        sizePolicy4.setVerticalStretch(0)
        sizePolicy4.setHeightForWidth(self.LBL_flecha.sizePolicy().hasHeightForWidth())
        self.LBL_flecha.setSizePolicy(sizePolicy4)

        self.gridLayout.addWidget(self.LBL_flecha,
                                  1,
                                  2,
                                  2,
                                  1)

        self.GRB_hotfolders = QGroupBox(self.WDT_central)
        self.GRB_hotfolders.setObjectName("GRB_hotfolders")
        sizePolicy5 = QSizePolicy(QSizePolicy.Preferred,
                                  QSizePolicy.Expanding)
        sizePolicy5.setHorizontalStretch(0)
        sizePolicy5.setVerticalStretch(0)
        sizePolicy5.setHeightForWidth(self.GRB_hotfolders.sizePolicy().hasHeightForWidth())
        self.GRB_hotfolders.setSizePolicy(sizePolicy5)
        self.GRB_hotfolders.setFont(font1)
        self.GRB_hotfolders.setAlignment(Qt.AlignLeading | Qt.AlignLeft | Qt.AlignTop)
        self.vert_lay_GRB_hotfolders = QVBoxLayout(self.GRB_hotfolders)
        self.vert_lay_GRB_hotfolders.setObjectName("vert_lay_GRB_hotfolders")
        self.vert_lay_GRB_hotfolders.setContentsMargins(20, -1, -1, -1)

        self.gridLayout.addWidget(self.GRB_hotfolders,
                                  1,
                                  3,
                                  2,
                                  1)

        self.VLS_down = QSpacerItem(10,
                                    10,
                                    QSizePolicy.Minimum,
                                    QSizePolicy.Fixed)
        self.gridLayout.addItem(self.VLS_down,
                                5,
                                1,
                                1,
                                3)

        MainWindow.setCentralWidget(self.WDT_central)

        self.Menubar = QMenuBar(MainWindow)
        self.Menubar.setObjectName("Menubar")
        self.Menubar.setEnabled(True)
        self.Menubar.setGeometry(QRect(0, 0, 420, 21))
        font3 = QFont()
        font3.setItalic(False)
        self.Menubar.setFont(font3)
        self.Menubar.setContextMenuPolicy(Qt.ActionsContextMenu)
        self.Menubar.setDefaultUp(False)

        self.menuArchivo = QMenu(self.Menubar)
        self.menuArchivo.setObjectName("menuArchivo")

        self.menuSeleccion = QMenu(self.Menubar)
        self.menuSeleccion.setObjectName("menuSeleccion")

        self.menuAyuda = QMenu(self.Menubar)
        self.menuAyuda.setObjectName("menuAyuda")

        self.menuModo_Borrado = QMenu(self.Menubar)
        self.menuModo_Borrado.setObjectName("menuModo_Borrado")

        MainWindow.setMenuBar(self.Menubar)

        self.Menubar.addAction(self.menuArchivo.menuAction())
        self.Menubar.addAction(self.menuSeleccion.menuAction())
        self.Menubar.addAction(self.menuModo_Borrado.menuAction())
        self.Menubar.addAction(self.menuAyuda.menuAction())

        self.menuArchivo.addAction(self.actionActualizar)
        self.menuArchivo.addAction(self.actionEditar_Fiery_y_HF)
        self.menuArchivo.addSeparator()
        self.menuArchivo.addAction(self.actionSalir)

        self.menuSeleccion.addAction(self.actionSeleccionar_todo)
        self.menuSeleccion.addAction(self.actionInvertir_seleccion)
        self.menuSeleccion.addAction(self.actionSeleccionar_nada)

        self.menuAyuda.addAction(self.actionAyuda)
        self.menuAyuda.addAction(self.actionAcerca_de)

        self.menuModo_Borrado.addAction(self.actionPermanente)

        self.retranslateUi(MainWindow)

        QMetaObject.connectSlotsByName(MainWindow)
    # setupUi

    def retranslateUi(self, MainWindow):
        self.actionActualizar.setText(QCoreApplication.translate("MainWindow",
                                                                 "A&ctualizar",
                                                                 None))
        self.actionActualizar.setShortcut(QCoreApplication.translate("MainWindow",
                                                                     "Ctrl+A",
                                                                     None))
        self.actionEditar_Fiery_y_HF.setText(QCoreApplication.translate("MainWindow",
                                                                        "&Editar Fiery y HF",
                                                                        None))
        self.actionEditar_Fiery_y_HF.setShortcut(QCoreApplication.translate("MainWindow",
                                                                            "Ctrl+E",
                                                                            None))
        self.actionSalir.setText(QCoreApplication.translate("MainWindow",
                                                            "&Salir",
                                                            None))
        self.actionSalir.setShortcut(QCoreApplication.translate("MainWindow",
                                                                "Ctrl+X",
                                                                None))
        self.actionSeleccionar_todo.setText(QCoreApplication.translate("MainWindow",
                                                                       "Seleccionar &todo",
                                                                       None))
        self.actionSeleccionar_todo.setShortcut(QCoreApplication.translate("MainWindow",
                                                                           "Ctrl+T",
                                                                           None))
        self.actionInvertir_seleccion.setText(QCoreApplication.translate("MainWindow",
                                                                         "&Invertir selección",
                                                                         None))
        self.actionInvertir_seleccion.setShortcut(QCoreApplication.translate("MainWindow",
                                                                             "Ctrl+I",
                                                                             None))
        self.actionSeleccionar_nada.setText(QCoreApplication.translate("MainWindow",
                                                                       "Seleccionar &nada",
                                                                       None))
        self.actionSeleccionar_nada.setShortcut(QCoreApplication.translate("MainWindow",
                                                                           "Ctrl+N",
                                                                           None))
        self.actionAyuda.setText(QCoreApplication.translate("MainWindow",
                                                            "&Ayuda",
                                                            None))
        self.actionAyuda.setShortcut(QCoreApplication.translate("MainWindow",
                                                                "Alt+Y",
                                                                None))
        self.actionAcerca_de.setText(QCoreApplication.translate("MainWindow",
                                                                "Acerca &de...",
                                                                None))
        self.actionPapelera.setText(QCoreApplication.translate("MainWindow",
                                                               "Papelera",
                                                               None))
        self.actionPermanente.setText(QCoreApplication.translate("MainWindow",
                                                                 "&Permanente",
                                                                 None))
        self.BTN_vaciar.setText(QCoreApplication.translate("MainWindow",
                                                           "VACIAR HOTFOLDERS (Papelera)",
                                                           None))
        self.BTN_vaciar.setShortcut(QCoreApplication.translate("MainWindow",
                                                               "Return",
                                                               None))
        self.GRB_fierys.setTitle(QCoreApplication.translate("MainWindow",
                                                            "Fiery",
                                                            None))                                                   
        self.LBL_flecha.setText(QCoreApplication.translate("MainWindow",
                                                           ">>",
                                                           None))
        self.GRB_hotfolders.setTitle(QCoreApplication.translate("MainWindow",
                                                                "Hot folders",
                                                                None))
        self.menuArchivo.setTitle(QCoreApplication.translate("MainWindow",
                                                             "&Archivo",
                                                             None))
        self.menuSeleccion.setTitle(QCoreApplication.translate("MainWindow",
                                                               "&Selección",
                                                               None))
        self.menuAyuda.setTitle(QCoreApplication.translate("MainWindow",
                                                           "A&yuda",
                                                           None))
        self.menuModo_Borrado.setTitle(QCoreApplication.translate("MainWindow",
                                                                  "Modo &Borrado",
                                                                  None))
    # retranslateUi

And that's the class that do population (manual method, not automated yet):

from os import path
from PySide2 import QtWidgets
from ui_limpia_Hot_Folders import Ui_MainWindow
from PySide2.QtCore import (QCoreApplication, QMetaObject, QRect, QSize, Qt)
from PySide2.QtGui import QFont
from PySide2.QtWidgets import QMessageBox, QCheckBox, QRadioButton, QSizePolicy


class Interfaz(QtWidgets.QMainWindow):
    """Ayuda gráfica para limpiar las hotfolders de Fiery.
    Selecciona automáticamente las que tienen trabajos en su listado."""

    def __init__(self):

        QtWidgets.QMainWindow.__init__(self)
        self.root = Ui_MainWindow()
        self.root.setupUi(self)
        self.setWindowTitle('Fierys & Hot Folders Editor v2.0')

        # Mostramos la ventana
        self.show()

        # Esta variable controla la existencia de la ventana de fieryeditorQT
        self._app = None

        self.version = 'V 2.0'
        self.fecha_version = 'marzo de 2024'
        self.tipo_borrado = 'a la papelera'

        self.root.actionActualizar.triggered.connect(self.__listar_maquinas)
        self.root.BTN_vaciar.clicked.connect(self.__listar_maquinas)

    def __listar_maquinas(self):
        sizePolicy3 = QSizePolicy(QSizePolicy.Fixed,
                                  QSizePolicy.Expanding)
        sizePolicy3.setHorizontalStretch(0)
        sizePolicy3.setVerticalStretch(0)

        # Añadimos un nuevo fiery, primero su checkbox
        self.root.CHB_fiery_2 = QCheckBox(self.root.GRB_fierys)
        self.root.CHB_fiery_2.setObjectName("CHB_fiery_2")
        font2 = QFont()
        font2.setPointSize(8)
        self.root.CHB_fiery_2.setFont(font2)
        self.root.CHB_fiery_2.setTristate(True)
        self.root.CHB_fiery_2.setText("Fiery_2 : 12")
        self.root.CHB_fiery_2.setMinimumHeight(20)
        self.root.grid_GRB_fierys.addWidget(self.root.CHB_fiery_2, 0, 0, 1, 1)

        # Y ahora el radiobutton
        self.root.RBT_fiery_2 = QRadioButton(self.root.GRB_fierys)
        self.root.RBT_fiery_2.setObjectName("RBT_fiery_2")
        self.root.RBT_fiery_2.setSizePolicy(sizePolicy3)
        self.root.RBT_fiery_2.setStatusTip("")
        self.root.RBT_fiery_2.setMinimumHeight(20)
        self.root.grid_GRB_fierys.addWidget(self.root.RBT_fiery_2, 0, 1, 1, 1)

        # Añadimos un nuevo fiery, primero su checkbox
        self.root.CHB_fiery_3 = QCheckBox(self.root.GRB_fierys)
        self.root.CHB_fiery_3.setObjectName("CHB_fiery_3")
        font2 = QFont()
        font2.setPointSize(8)
        self.root.CHB_fiery_3.setFont(font2)
        self.root.CHB_fiery_3.setTristate(True)
        self.root.CHB_fiery_3.setText("Fiery_3 : 15")
        self.root.CHB_fiery_3.setMinimumHeight(20)
        self.root.grid_GRB_fierys.addWidget(self.root.CHB_fiery_3, 1, 0, 1, 1)

        # Y ahora el radiobutton
        self.root.RBT_fiery_3 = QRadioButton(self.root.GRB_fierys)
        self.root.RBT_fiery_3.setObjectName("RBT_fiery_3")
        self.root.RBT_fiery_3.setSizePolicy(sizePolicy3)
        self.root.RBT_fiery_3.setStatusTip("")
        self.root.RBT_fiery_3.setMinimumHeight(20)
        self.root.grid_GRB_fierys.addWidget(self.root.RBT_fiery_3, 1, 1, 1, 1)

        # Añadimos un nuevo fiery, primero su checkbox
        self.root.CHB_fiery_4 = QCheckBox(self.root.GRB_fierys)
        self.root.CHB_fiery_4.setObjectName("CHB_fiery_4")
        font2 = QFont()
        font2.setPointSize(8)
        self.root.CHB_fiery_4.setFont(font2)
        self.root.CHB_fiery_4.setTristate(True)
        self.root.CHB_fiery_4.setText("Fiery_4 : 8")
        self.root.CHB_fiery_4.setMinimumHeight(20)
        self.root.grid_GRB_fierys.addWidget(self.root.CHB_fiery_4, 2, 0, 1, 1)

        # Y ahora el radiobutton
        self.root.RBT_fiery_4 = QRadioButton(self.root.GRB_fierys)
        self.root.RBT_fiery_4.setObjectName("RBT_fiery_4")
        self.root.RBT_fiery_4.setSizePolicy(sizePolicy3)
        self.root.RBT_fiery_4.setStatusTip("")
        self.root.RBT_fiery_4.setMinimumHeight(20)
        self.root.grid_GRB_fierys.addWidget(self.root.RBT_fiery_4, 2, 1, 1, 1)

        # Añadimos una hotfolder
        self.root.CHB_hotfolder_1 = QCheckBox(self.root.GRB_hotfolders)
        self.root.CHB_hotfolder_1.setObjectName("CHB_hotfolder_1")
        self.root.CHB_hotfolder_1.setFont(font2)
        self.root.vert_lay_GRB_hotfolders.addWidget(self.root.CHB_hotfolder_1)
        self.root.CHB_hotfolder_1.setText("Hotfolder 1  :  12")

        self.root.GRB_fierys.adjustSize()
        self.root.GRB_hotfolders.adjustSize()


if __name__ == '__main__':
    app = QtWidgets.QApplication([])
    app.setStyle('Fusion')
    window = Interfaz()
    app.exec_()

I use abbrevs in the name of the widgets to easilly identify and search them in Pycharm structure: WDT - widget, BTN - button., LBL - label, GRB - groupbox, VLS - vertical spacer, HZS - horizontal spacer.

I have tried a lot of solutions, but almost all are about use Qt Designer auto layouts, and I'm doing from scratch.

Upvotes: 0

Views: 111

Answers (1)

Viper_7691
Viper_7691

Reputation: 1

I post it like answer, to help someone else with the same problem. Easier to find than buried between 20 comments. @musicamante have the solution:

Try resetting the minimum size property of the main window (be careful: you should not set it to 0, but actually reset it by clicking the small red arrow). Setting a minimum dimension does not only ensure that the widget has a minimum size, but also tells its layout that the contents may be stretched in order to allow that minimum size.

Thanks!

if @musicamante publish the answer, I'll delete this message and vote it like OK.

Upvotes: 0

Related Questions