Reputation: 1
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:
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 manually resized (only vert allowed):
That's the 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
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