PyQt QGridLayout позволяет размещать виджеты в однородных строках и столбцах сетки в Python.
Что такое PyQt QGridLayout
На следующем рисунке показана сетка, состоящая из четырех столбцов и трех строк:
Индексация строк и столбцов начинается с нуля. Это означает, что первая строка имеет индекс ноль, вторая строка имеет индекс один и т. д. Аналогично, первый столбец имеет индекс ноль, второй столбец имеет индекс один и т. д.
Пересечение строки и столбца называется ячейкой. Ячейка — это пространство, в котором можно разместить виджет.
Строки и столбцы могут объединяться. Например, на следующем рисунке показано, что второй столбец первой строки охватывает два столбца, а вторая строка второго столбца охватывает две строки:
Если виджет занимает меньше места, чем содержащая его ячейка, вы можете выровнять его внутри ячейки, используя один из следующих вариантов выравнивания:

| Флаг выравнивания | Значение |
|---|---|
| AlignAbsolute | Если направление слева направо, AlignLeft означает выравнивание по правому краю. Однако, если вы хотите, чтобы AlignLeft всегда был выровнен по левому краю, вы можете объединить AlignLeft с опцией AlignAbsolute. |
| AlignBaseline | Выравнивание виджета по базовой линии. |
| AlignBottom | Выравнивание виджета по нижнему краю. |
| AlignCenter | Центрирует виджет в обоих измерениях. |
| AlignHCenter | Центрирует виджет по горизонтали в доступном пространстве. |
| AlignHorizontal_Mask | Выровнять по левому краю | Выровнять по правому краю | Выровнять по центру | Выровнять по ширине | Выровнять по абсолютному краю |
| AlignJustify | Выравнивает текст по доступному пространству. |
| AlignLeft | Выравнивание виджета по левому краю. |
| AlignRight | По правому краю. |
| AlignTop | По верхнему краю. |
| AlignVCenter | Центрирует виджет по вертикали в доступном пространстве. |
| AlignVertical_Mask | Выровнять по верху | Выровнять по низу | Выровнять по центру | Выровнять по базовой линии |
Использование QGridLayout
Чтобы использовать QGridLayout, выполните следующие действия:
- Сначала создайте объект QGridLayout:
layout = QGridLayout()
- Во-вторых, задайте макет родительского виджета:
parent.setLayout(layout)
- В-третьих, разместите дочерние виджеты на сетке:
layout.addWidget(widget, row, column, rowSpan, columnSpan, alignment)
В этом синтаксисе:
- widget — это дочерний виджет, который вы хотите разместить в сетке.
- row — это индекс строки, начинающийся с 0.
- column — это индекс столбца, начинающийся с 0.
- rowSpan — количество строк, которые вы хотите охватить.
- columnSpan — количество столбцов, которые вы хотите охватить.
- alignment определяет выравнивание виджета внутри ячейки.
Чтобы получить значение выравнивания, импортируйте Qt из PyQt6.QtCore:
from PyQt6.QtCore import Qt
и используйте одно из значений перечисления Qt.AlignmentFlag, например:
Qt.AlignmentFlag.AlignRight
Пример PyQt QGridLayout
В следующем примере показано, как создать форму входа с использованием QGridLayout:
import sys
from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QLineEdit, QLabel, QGridLayout
from PyQt6.QtCore import Qt
class MainWindow(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setWindowTitle('Login Form')
# set the grid layout
layout = QGridLayout()
self.setLayout(layout)
# username
layout.addWidget(QLabel('Username:'), 0, 0)
layout.addWidget(QLineEdit(), 0, 1)
# password
layout.addWidget(QLabel('Password:'), 1, 0)
layout.addWidget(QLineEdit(echoMode=QLineEdit.EchoMode.Password), 1, 1)
# buttons
layout.addWidget(QPushButton('Log in'), 2, 0,
alignment=Qt.AlignmentFlag.AlignRight)
layout.addWidget(QPushButton('Close'), 2, 1,
alignment=Qt.AlignmentFlag.AlignRight)
# show the window
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
sys.exit(app.exec())
Выход:

Как это работает.
- Сначала создайте объект QGridLayout:
layout = QGridLayout() self.setLayout(layout)
- Во-вторых, поместите QLabel в ячейку(0,0) и QLineEdit в ячейку(0,1) для создания поля имени пользователя:
layout.addWidget(QLabel('Username:'), 0, 0)
layout.addWidget(QLineEdit(), 0, 1)
- В-третьих, поместите QLabel в ячейку(1,0) и QLineEdit в ячейку(1,1) для создания поля пароля:
layout.addWidget(QLabel('Password:'), 1, 0)
layout.addWidget(QLineEdit(echoMode=QLineEdit.EchoMode.Password), 1, 1)
- Наконец, поместите кнопку входа в ячейку(2,0) и выровняйте ее по левому краю. Также поместите кнопку закрытия в ячейку(2,1) и выровняйте ее по правому краю.
# buttons
layout.addWidget(QPushButton('Log in'), 2, 0,
alignment=Qt.AlignmentFlag.AlignRight)
layout.addWidget(QPushButton('Close'), 2, 1,
alignment=Qt.AlignmentFlag.AlignRight) 