Горизонтальное и вертикальное выравнивание

Компоненты-контейнеры (их еще называют менеджерами компоновки, менеджерами геометрии) лишены недостатков абсолютного позиционирования. При изменении размеров окна производится автоматическое изменение характеристик всех компонентов, добавленных в контейнер. Настройки шрифта при этом также учитываются, поэтому изменение размеров шрифта в два раза приведет только к увеличению компонентов и размеров окна.

Для автоматического выравнивания компонентов используются два класса:

  • QHBoxLayout — выстраивает все добавляемые компоненты по горизонтали (по умолчанию слева направо). Конструкторы класса:
#include <QHBoxLayout>
QHBoxLayout()
QHBoxLayout(QWidget *parent)
  • QVBoxLayout — выстраивает все добавляемые компоненты по вертикали (по умолчанию сверху вниз). Конструкторы класса:
#include <QVBoxLayout>
QVBoxLayout()
QVBoxLayout(QWidget *parent)

Иерархия наследования для классов QHBoxLayout и QVBoxLayout выглядит так:

(QObject, QLayoutItem) — QLayout — QBoxLayout — QHBoxLayout
(QObject, QLayoutItem) — QLayout — QBoxLayout — QVBoxLayout

Обратите внимание на то, что классы не являются наследниками класса QWidget, следовательно, они не обладают собственным окном и не могут использоваться отдельно. Поэтому контейнеры обязательно должны быть привязаны к родительскому компоненту. Передать указатель на родительский компонент можно через конструктор классов QHBoxLayout и QVBoxLayout. Кроме того, можно передать указатель на контейнер в метод setLayout() родительского компонента. Прототип метода:

void setLayout(QLayout *layout)

После этого все компоненты, добавленные в контейнер, автоматически привязываются к родительскому компоненту. Типичный пример использования класса QHBoxLayout выглядит следующим образом:

QWidget window;                               // Родительский компонент
window.setWindowTitle("Выравнивание по горизонтали");
window.resize(300, 120);
QPushButton *btn1 = new QPushButton("1");
QPushButton *btn2 = new QPushButton("2");
QPushButton *btn3 = new QPushButton("3");
QHBoxLayout *hbox = new QHBoxLayout();        // Создаем контейнер
hbox->addWidget(btn1);                        // Добавляем компоненты
hbox->addWidget(btn2);
hbox->addWidget(btn3);
window.setLayout(hbox);                       // Передаем родителю
window.show();

Добавить компоненты в контейнер и удалить их позволяют следующие методы:

  • addWidget() — добавляет компонент в конец контейнера. Прототип метода:
void addWidget(QWidget *widget, int stretch = 0,
               Qt::Alignment alignment = Qt::Alignment())

В первом параметре передается указатель на компонент. Необязательный параметр stretch задает фактор растяжения для ячейки, а параметр alignment — выравнивание компонента внутри ячейки. Пример:

hbox->addWidget(btn1, 10, Qt::AlignRight);
  • insertWidget() — добавляет компонент в указанную позицию контейнера. Прототип метода:
void insertWidget(int index, QWidget *widget, int stretch = 0,
                  Qt::Alignment alignment = Qt::Alignment())

Если в первом параметре указано значение 0, то компонент будет добавлен в начало контейнера. Если указано отрицательное значение, то компонент добавляется в конец контейнера. Другое значение указывает определенную позицию. Остальные параметры аналогичны параметрам метода addWidget(). Пример:

hbox->addWidget(btn1);
hbox->insertWidget(-1, btn2); // Добавление в конец
hbox->insertWidget(0, btn3);  // Добавление в начало
  • removeWidget() — удаляет компонент из контейнера. Прототип метода:
void removeWidget(QWidget *widget)
  • addLayout() — добавляет другой контейнер в конец текущего контейнера. С помощью этого метода можно вкладывать один контейнер в другой, создавая таким образом структуру любой сложности. Прототип метода:
void addLayout(QLayout *layout, int stretch = 0)
  • insertLayout() — добавляет другой контейнер в указанную позицию текущего контейнера. Если в первом параметре указано отрицательное значение, то контейнер добавляется в конец. Прототип метода:
void insertLayout(int index, QLayout *layout, int stretch = 0)
  • addSpacing() — добавляет пустое пространство указанного размера в конец контейнера. Прототип метода:
void addSpacing(int size)
  • insertSpacing() — добавляет пустое пространство указанного размера в определенную позицию. Если в первом параметре указано отрицательное значение, то пространство добавляется в конец. Прототип метода:
void insertSpacing(int index, int size)
  • addStretch() — добавляет пустое растягиваемое пространство с нулевым минимальным размером и фактором растяжения stretch в конец контейнера. Это пространство можно сравнить с пружиной, вставленной между компонентами, а параметр stretch с жесткостью пружины. Прототип метода:
void addStretch(int stretch = 0)
  • insertStretch() — метод аналогичен методу addStretch(), но добавляет растягиваемое пространство в указанную позицию. Если в первом параметре указано отрицательное значение, то пространство добавляется в конец контейнера. Прототип метода:
void insertStretch(int index, int stretch = 0)

Параметр alignment в методах addWidget() и insertWidget() задает выравнивание компонента внутри ячейки. В этом параметре можно указать следующие константы:

  • Qt::AlignLeft — горизонтальное выравнивание по левому краю;
  • Qt::AlignRight — горизонтальное выравнивание по правому краю;
  • Qt::AlignHCenter — горизонтальное выравнивание по центру;
  • Qt::AlignJustify — заполнение всего пространства;
  • Qt::AlignTop — вертикальное выравнивание по верхнему краю;
  • Qt::AlignBottom — вертикальное выравнивание по нижнему краю;
  • Qt::AlignVCenter — вертикальное выравнивание по центру;
  • Qt::AlignBaseline — вертикальное выравнивание по базовой линии;
  • Qt::AlignCenter — горизонтальное и вертикальное выравнивание по центру;
  • Qt::AlignAbsolute — если в методе setLayoutDirection() из класса QWidget указана константа Qt::RightToLeft, то константа Qt::AlignLeft задает выравнивание по правому краю, а константа Qt::AlignRight — по левому краю. Чтобы константа Qt::AlignLeft всегда соответствовала именно левому краю необходимо указать комбинацию Qt::AlignAbsolute | Qt::AlignLeft. Аналогично следует поступить с константой Qt::AlignRight.

Можно задавать комбинацию констант. В комбинации допускается указывать только одну константу горизонтального выравнивания и только одну константу вертикального выравнивания. Например, комбинация Qt::AlignLeft | Qt::AlignTop задает выравнивание по левому и верхнему краю. Противоречивые значения приводят к непредсказуемым результатам.

Помимо рассмотренных методов, контейнеры поддерживают следующие методы (перечислены только основные методы; полный список смотрите в документации):

  • setDirection() — задает направление вывода компонентов. Прототип метода:
void setDirection(QBoxLayout::Direction direction)

В параметре можно указать следующие константы из класса QBoxLayout:

  • QBoxLayout::LeftToRight — слева направо (значение по умолчанию для горизонтального контейнера);
  • QBoxLayout::RightToLeft — справа налево;
  • QBoxLayout::TopToBottom — сверху вниз (значение по умолчанию для вертикального контейнера);
  • QBoxLayout::BottomToTop — снизу вверх;
  • setSpacing() — задает расстояние между компонентами. Прототип метода:
void setSpacing(int)
  • setContentsMargins() — задает величину отступа от границ контейнера до компонентов. Прототипы метода:
void setContentsMargins(int left, int top, int right, int bottom)
void setContentsMargins(const QMargins &margins)

Учебник C++ (Qt Creator и MinGW)
Учебник C++ (Qt Creator и MinGW) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов