PySide2 和 Qt Designer:无法使 QGroupBox 在运行时展开

问题描述 投票:0回答:1

我是 Tkinter 用户,但我决定使用 Qt 库,因为最终结果更专业。我正在重新编码一个旧界面,该界面是根据 ini 文件的内容在运行时填充的。

IMG起点:

IMG starting point

但是当我这样做时,新闻小部件几乎堆叠在一起。如果我手动扩展窗口,小部件会使用所有垂直空间,但我试图让它们留在窗口顶部。

IMG 已填充:

IMG populated,

IMG 手动调整大小(仅允许垂直):

IMG manually resized (only vert allowed)

这就是 Qt Designer UI:

IMG Qt Designer UI

这就是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

这就是进行填充的类(手动方法,尚未自动化):

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_()

我在小部件的名称中使用缩写,以便在 Pycharm 结构中轻松识别和搜索它们: WDT - 小部件、BTN - 按钮。、LBL - 标签、GRB - 组框、VLS - 垂直间隔符、HZS - 水平间隔符。

我尝试了很多解决方案,但几乎都是关于使用 Qt Designer 自动布局,而且我是从头开始。

qt runtime pyside2 autoresize qgroupbox
1个回答
0
投票

我将其发布为答案,以帮助其他遇到同样问题的人。查找比埋藏在 20 条评论中更容易。 @musicamante 有解决方案:

尝试重置主窗口的最小尺寸属性(注意:您不应该将其设置为 0,而是通过单击红色小箭头实际重置它)。设置最小尺寸不仅可以确保小部件具有最小尺寸,还可以告诉其布局,可以拉伸内容以允许最小尺寸。

谢谢!

如果@musicamante 发布答案,我将删除此消息并投票“OK”。

© www.soinside.com 2019 - 2024. All rights reserved.