Search code examples
pythonpyqtqgroupbox

How to control QGroupBox resizing


The code below creates a single dialog with GroupBox() resizing in sync with the dialog. This is default resizing policy for GroupBox. How to change this policy so GroupBox occupies as little space (area) as possible and never expands vertically. How to achieve it?

enter image description here

from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])

panel=QtGui.QDialog()
panel.setLayout(QtGui.QVBoxLayout())

groupbox = QtGui.QGroupBox('Group Box')
groupbox.setLayout(QtGui.QVBoxLayout())
panel.layout().addWidget(groupbox)

for i in range(3):
    row = QtGui.QHBoxLayout()
    row.addWidget(QtGui.QLabel('Label'))
    row.addWidget(QtGui.QLineEdit())
    row.addWidget(QtGui.QPushButton('Push Button'))
    groupbox.layout().addLayout(row)

panel.layout().addWidget(QtGui.QPushButton('Confirm'))

panel.show()
app.exec_()

Solution

  • The simplest one by ekhumoro:

    enter image description here

    from PyQt4 import QtCore, QtGui
    app = QtGui.QApplication([])
    
    panel=QtGui.QDialog()
    panel.setLayout(QtGui.QVBoxLayout())
    
    groupbox = QtGui.QGroupBox('Group Box')
    groupbox.setLayout(QtGui.QVBoxLayout())
    panel.layout().addWidget(groupbox)
    panel.layout().addStretch()
    
    for i in range(3):
        row = QtGui.QHBoxLayout()
        row.addWidget(QtGui.QLabel('Label'))
        row.addWidget(QtGui.QLineEdit())
        row.addWidget(QtGui.QPushButton('Push Button'))
        groupbox.layout().addLayout(row)
    
    panel.layout().addWidget(QtGui.QPushButton('Confirm'))
    
    panel.show()
    app.exec_()
    

    The second approach works as well after we replace .addWidget with .addItem:

    from PyQt4 import QtCore, QtGui
    app = QtGui.QApplication([])
    
    panel=QtGui.QDialog()
    panel.setLayout(QtGui.QVBoxLayout())
    
    groupbox = QtGui.QGroupBox('Group Box')
    groupbox.setLayout(QtGui.QVBoxLayout())
    panel.layout().addWidget(groupbox)
    panel.layout().addItem(QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding))
    for i in range(3):
        row = QtGui.QHBoxLayout()
        row.addWidget(QtGui.QLabel('Label'))
        row.addWidget(QtGui.QLineEdit())
        row.addWidget(QtGui.QPushButton('Push Button'))
        groupbox.layout().addLayout(row)
    
    panel.layout().addWidget(QtGui.QPushButton('Confirm'))
    
    panel.show()
    app.exec_()