PyQt QHBoxLayout в Python для горизонтального размещения виджетов

Макет PyQt определяет способ размещения дочерних виджетов на родительском виджете. PyQt поддерживает множество классов макетов, каждый из которых имеет стратегию макета, подходящую для конкретной ситуации.

Шаги по использованию класса макета следующие:

  • Сначала создайте объект макета из класса макета.
  • Во-вторых, назначьте объект макета свойству макета родительского виджета с помощью метода setLayout().
  • В-третьих, добавьте виджеты в макет с помощью метода addWidget() объекта макета.

Также вы можете добавлять макеты в макет с помощью метода addLayout(). Это позволяет вам создавать более сложный макет для размещения виджетов.

Содержание

Что такое PyQt QHBoxLayout

Линейный макет PyQt QHBoxLayout делит родительский виджет на горизонтальные блоки и размещает дочерние виджеты последовательно слева направо в Python.

Следующая программа показывает, как использовать QHBoxLayout:

import sys
from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout


class MainWindow(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setWindowTitle('PyQt QHBoxLayout')

        # create a layout
        layout = QHBoxLayout()
        self.setLayout(layout)

        # create buttons and add them to the layout
        titles = ['Yes', 'No', 'Cancel']
        buttons = [QPushButton(title) for title in titles]
        for button in buttons:
            layout.addWidget(button)

        # show the window
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())

Выход:

PyQt QHBoxLayout

Как это работает.

  • Сначала создайте объект QHBoxLayout:
layout = QHBoxLayout()
  • Во-вторых, задайте макет для MainWindow, вызвав его метод setLayout():
self.setLayout(layout)
  • В-третьих, создайте три кнопки с помощью QPushButton и добавьте их в макет с помощью метода addWidget():
titles = ['Yes', 'No', 'Cancel']
buttons = [QPushButton(title) for title in titles]
for button in buttons:
    layout.addWidget(button)

Обратите внимание, что мы используем списочное представление для создания трех кнопок на основе списка заголовков.

Выравнивания

Когда в родительском виджете много места для дочерних виджетов, они растягиваются по горизонтали следующим образом:

PyQt QHBoxLayout — кнопки растягиваются по горизонтали

Чтобы сохранить дочерние виджеты в размерах по умолчанию и выровнять их по горизонтали, используйте горизонтальный разделитель.

Выровнять по левому краю

Чтобы выровнять кнопку слева от родительского виджета, добавьте горизонтальный разделитель после дочерних виджетов в QHBoxLayout. Например:

PyQt QHBoxLayout — выравнивание по левому краю с использованием горизонтального разделителя

В этом примере горизонтальный разделитель растягивается до конца макета и оставляет достаточно места для кнопок.

Чтобы добавить горизонтальный разделитель в конец макета, вызовите метод addStretch() после добавления всех кнопок в макет:

import sys
from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout


class MainWindow(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setWindowTitle('PyQt QHBoxLayout')

        # create a layout
        layout = QHBoxLayout()
        self.setLayout(layout)

        # create buttons and add them to the layout
        titles = ['Yes', 'No', 'Cancel']
        buttons = [QPushButton(title) for title in titles]
        for button in buttons:
            layout.addWidget(button)

        # add a spacer
        layout.addStretch()

        # show the window
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())

Выровнять по правому краю

Аналогично вы можете добавить разделитель в начале макета, чтобы сместить кнопки вправо:

PyQt QHBoxLayout — выравнивание по правому краю с использованием горизонтального разделителя

Для этого перед добавлением кнопок в макет вызывается метод addStretch():

import sys
from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout


class MainWindow(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setWindowTitle('PyQt QHBoxLayout')

        # create a layout
        layout = QHBoxLayout()
        self.setLayout(layout)

        # add a spacer
        layout.addStretch()

        # create buttons and add them to the layout
        titles = ['Yes', 'No', 'Cancel']
        buttons = [QPushButton(title) for title in titles]
        for button in buttons:
            layout.addWidget(button)

        # show the window
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())

Выровнять по центру

Чтобы выровнять кнопки по центру, добавьте один горизонтальный разделитель в начале, а другой в конце макета:

Выравнивание по центру с помощью горизонтального разделителя

Для этого необходимо вызвать метод addStretch() до и после добавления кнопок в макет:

import sys
from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout


class MainWindow(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setWindowTitle('PyQt QHBoxLayout')

        # create a layout
        layout = QHBoxLayout()
        self.setLayout(layout)

        # add a spacer
        layout.addStretch()

        # create buttons and add them to the layout
        titles = ['Yes', 'No', 'Cancel']
        buttons = [QPushButton(title) for title in titles]
        for button in buttons:
            layout.addWidget(button)

        # add a spacer
        layout.addStretch()

        # show the window
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())

Размещение горизонтального разделителя между виджетами

Между виджетами можно разместить горизонтальный разделитель, чтобы сместить их влево и вправо от макета:

Горизонтальный разделитель между виджетами

import sys
from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout


class MainWindow(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setWindowTitle('PyQt QHBoxLayout')

        # create a layout
        layout = QHBoxLayout()
        self.setLayout(layout)

        # create buttons and add them to the layout
        titles = ['Yes', 'No', 'Cancel']
        buttons = [QPushButton(title) for title in titles]

        # add the buttons
        layout.addWidget(buttons[0])
        layout.addWidget(buttons[1])
        
        # add a spacer
        layout.addStretch()

        # add the cancel button
        layout.addWidget(buttons[2])

        # show the window
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())

Установка коэффициентов растяжения макета

Изначально дочерний виджет принимает свой размер по умолчанию. Чтобы задать пространство, которое дочерний виджет может растянуть, вы вызываете метод setStretchFactor() объекта QHBoxLayout:

setStretchFactor(widget, factor)

Например, мы можем сделать кнопки «Да» и «Нет» одинакового размера и занимать в два раза больше места, чем кнопка «Отмена», используя коэффициенты растяжения:

PyQt QHBoxLayout - Факторы растяжения макета

import sys
from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout


class MainWindow(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setWindowTitle('PyQt QHBoxLayout')

        # create a layout
        layout = QHBoxLayout()
        self.setLayout(layout)

        # create buttons and add them to the layout
        titles = ['Yes', 'No', 'Cancel']
        buttons = [QPushButton(title) for title in titles]
        for button in buttons:
            layout.addWidget(button)

        # set the stretch factors
        layout.setStretchFactor(buttons[0], 2)
        layout.setStretchFactor(buttons[1], 2)
        layout.setStretchFactor(buttons[2], 1)

        # show the window
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())

Установка интервалов между виджетами

По умолчанию QHBoxLayout устанавливает стандартное пространство между дочерними виджетами. Чтобы изменить пространство между ними, используйте метод setSpacing() объекта QHBoxLayout.

В следующем примере метод setSpacing() используется для установки интервалов между кнопками в 50 пикселей:

PyQt QHBoxLayout - Интервал

import sys
from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout


class MainWindow(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setWindowTitle('PyQt QHBoxLayout')

        # create a layout
        layout = QHBoxLayout()
        self.setLayout(layout)

        # create buttons and add them to the layout
        titles = ['Yes', 'No', 'Cancel']
        buttons = [QPushButton(title) for title in titles]
        for button in buttons:
            layout.addWidget(button)

        layout.setSpacing(50)

        # show the window
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())

Установка полей контента

По умолчанию QHBoxLayout устанавливает определенные левые, верхние, правые и нижние поля для дочерних виджетов. Чтобы изменить поля, используйте метод setContentsMargins():

PyQt QHBoxLayout — пример настройки полей содержимого

setContentsMargins(self, left: int, top: int, right: int, bottom: int) -> None

В следующем примере setContentsMargins() используется для установки левого, верхнего, правого и нижнего полей для дочерних виджетов:

import sys
from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout


class MainWindow(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setWindowTitle('PyQt QHBoxLayout')

        # create a layout
        layout = QHBoxLayout()
        self.setLayout(layout)

        # create buttons and add them to the layout
        titles = ['Yes', 'No', 'Cancel']
        buttons = [QPushButton(title) for title in titles]
        for button in buttons:
            layout.addWidget(button)

        layout.setContentsMargins(50, 50, 50, 50)

        # show the window
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())
Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *