PyQt QHBoxLayout в Python для горизонтального размещения виджетов
Макет PyQt определяет способ размещения дочерних виджетов на родительском виджете. PyQt поддерживает множество классов макетов, каждый из которых имеет стратегию макета, подходящую для конкретной ситуации.
Шаги по использованию класса макета следующие:
- Сначала создайте объект макета из класса макета.
- Во-вторых, назначьте объект макета свойству макета родительского виджета с помощью метода setLayout().
- В-третьих, добавьте виджеты в макет с помощью метода addWidget() объекта макета.
Также вы можете добавлять макеты в макет с помощью метода addLayout(). Это позволяет вам создавать более сложный макет для размещения виджетов.
- Что такое PyQt QHBoxLayout
- Выравнивания
- Выровнять по левому краю
- Выровнять по правому краю
- Выровнять по центру
- Размещение горизонтального разделителя между виджетами
- Установка коэффициентов растяжения макета
- Установка интервалов между виджетами
- Установка полей контента
Что такое 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())
Выход:
Как это работает.
- Сначала создайте объект 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)
Обратите внимание, что мы используем списочное представление для создания трех кнопок на основе списка заголовков.
Выравнивания
Когда в родительском виджете много места для дочерних виджетов, они растягиваются по горизонтали следующим образом:
Чтобы сохранить дочерние виджеты в размерах по умолчанию и выровнять их по горизонтали, используйте горизонтальный разделитель.
Выровнять по левому краю
Чтобы выровнять кнопку слева от родительского виджета, добавьте горизонтальный разделитель после дочерних виджетов в 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())
Выровнять по правому краю
Аналогично вы можете добавить разделитель в начале макета, чтобы сместить кнопки вправо:
Для этого перед добавлением кнопок в макет вызывается метод 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)
Например, мы можем сделать кнопки «Да» и «Нет» одинакового размера и занимать в два раза больше места, чем кнопка «Отмена», используя коэффициенты растяжения:
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 пикселей:
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():
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())