На этом шаге мы приведем первоначальные сведения о контейнерах и пример их использования.
Компоненты-контейнеры (их еще называют менеджерами компоновки и менеджерами геометрии) лишены недостатков абсолютного позиционирования. При изменении размеров окна производится автоматическое изменение характеристик всех компонентов, добавленных в контейнер. Настройки шрифта при этом также учитываются, поэтому изменение размеров шрифта в два раза приведет только к увеличению компонентов и окон.
Для автоматического выравнивания компонентов используются два класса:
<Объект> = QHBoxLayout([<Родитель>])
<Объект> = QVBoxLayout([<Родитель>])
Иерархия наследования для этих классов выглядит так:
(QObject, QLayoutItem) - QLayout - QBoxLayout - QHBoxLayout (QObject, QLayoutItem) - QLayout - QBoxLayout - QVBoxLayout
Обратите внимание, что указанные классы не являются наследниками класса QWidget, a следовательно, не обладают собственным окном и не могут использоваться отдельно. Поэтому контейнеры обязательно должны быть привязаны к родительскому компоненту.
Передать ссылку на родительский компонент можно через конструктор классов QHBoxLayout и QVBoxLayout. Кроме того, можно передать ссылку на контейнер в метод setLayout() родительского компонента. После этого все компоненты, добавленные в контейнер, автоматически привязываются к родительскому компоненту.
Типичный пример использования класса QHBoxLayout показан в программе ниже, а увидеть результат выполнения этого кода можно на рисунке 1.
# -*- coding: utf-8 -*- from PyQt5 import QtWidgets import sys app = QtWidgets.QApplication(sys.argv) window = QtWidgets.QWidget() window.setWindowTitle("QHBoxLayout") # Родительский компонент - окно window.resize(300, 60) button1 = QtWidgets.QPushButton("1") button2 = QtWidgets.QPushButton("2") hbox = QtWidgets.QHBoxLayout() # Создаем контейнер hbox.addWidget(button1) # Добавляем компоненты hbox.addWidget(button2) window.setLayout(hbox) # Передаем ссыпку родителю window.show() sys.exit(app.exec_())
Результат работы приложения изображен на рисунке 1.
Рис.1. Контейнер QHBoxLayout с двумя кнопками
На следующем шаге мы закончим изучение этого вопроса.