This tutorial provides a comprehensive guide to using PyQt5’s powerful QGridLayout
for creating flexible and organized user interfaces. We’ll cover the basics, advanced techniques like spanning cells and controlling widget stretching, and offer practical examples to solidify your understanding.
Table of Contents
- Basic Usage of QGridLayout
- Spanning Multiple Cells
- Controlling Widget Stretching
- Advanced Techniques and Considerations
1. Basic Usage of QGridLayout
The QGridLayout
arranges widgets in a grid of rows and columns. Each widget occupies a single cell by default. Let’s start with a simple example:
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QGridLayout
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("PyQt5 Grid Layout Example")
layout = QGridLayout()
button1 = QPushButton("Button 1")
button2 = QPushButton("Button 2")
button3 = QPushButton("Button 3")
button4 = QPushButton("Button 4")
layout.addWidget(button1, 0, 0) # Row 0, Column 0
layout.addWidget(button2, 0, 1) # Row 0, Column 1
layout.addWidget(button3, 1, 0) # Row 1, Column 0
layout.addWidget(button4, 1, 1) # Row 1, Column 1
window.setLayout(layout)
window.show()
sys.exit(app.exec_())
This creates a 2×2 grid of buttons. addWidget(widget, row, column)
adds a widget to the specified row and column (zero-indexed).
2. Spanning Multiple Cells
To make a widget span multiple rows or columns, use addWidget(widget, row, column, rowspan, colspan)
. rowspan
and colspan
define the number of rows and columns the widget occupies.
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QGridLayout, QLabel
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("PyQt5 Grid Layout Span Example")
layout = QGridLayout()
label = QLabel("This label spans two columns")
button1 = QPushButton("Button 1")
button2 = QPushButton("Button 2")
layout.addWidget(label, 0, 0, 1, 2) # Spans two columns
layout.addWidget(button1, 1, 0)
layout.addWidget(button2, 1, 1)
window.setLayout(layout)
window.show()
sys.exit(app.exec_())
Here, the label spans two columns.
3. Controlling Widget Stretching
By default, widgets are sized to their minimum size. To control how widgets expand to fill available space, use setColumnStretch(column, stretch)
and setRowStretch(row, stretch)
. A higher stretch factor means the widget will take up a proportionally larger share of the available space.
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QGridLayout
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("PyQt5 Grid Layout Stretch Example")
layout = QGridLayout()
button1 = QPushButton("Button 1")
button2 = QPushButton("Button 2")
layout.addWidget(button1, 0, 0)
layout.addWidget(button2, 0, 1)
layout.setColumnStretch(1, 2) # Column 1 stretches twice as much as column 0
window.setLayout(layout)
window.show()
sys.exit(app.exec_())
button2
will now take up twice the horizontal space of button1
.
4. Advanced Techniques and Considerations
For more complex layouts, consider using:
addLayout()
: Embed other layouts within aQGridLayout
for nested structures.- Alignment: Use
setAlignment()
to control the alignment of widgets within their cells. - Spacing: Adjust spacing between rows and columns using
setVerticalSpacing()
andsetHorizontalSpacing()
. - Margins: Control the margins around the entire grid using
setContentsMargins()
.
Mastering these techniques will enable you to create sophisticated and highly adaptable PyQt5 interfaces.