Для того. щоб розумно розмістити віджети на формі, необхідно врахувати ряд деталей:
- розмір сусідніх віджетів;
- візуальні компоненти можуть динамічно змінювати розмір, приховуватись чи з'являтись внаслідок
- роботи логіки програми;
- форма, у якій розміщують віджети, може динамічно змінювати розмір під час роботи програми (коли користувач змінює розмір вікна чи розкриває його на весь екран);
- часто буває потрібно розтягнути візуальну компоненту таким чином, щоб вона займала увесь простір форми, або ж щоб кілька компонентів займали простір форми пропорційно ( у відповідних пропорціях 1:1, 1:2, 3:5 тощо);
- часто буває потрібно розмістити віджети або групи віджетів вертикально чи горизонтально на формі, тощо.
Зрозуміло, що така логіка є досить складною для реалізації при повсякденному створенні інтерфейсів користувача різної структури та складності. На щастя, в арсеналі Qt є досить потужний інструмент для впорядковування віджетів на формі — компонування.
Компонування дає змогу впорядкувати розміщення компонент, у той же час залишаючи інтерфейс гнучким до змін, таких як зміна розміру чи зміна кількості елементів на формі. Також компонування може забезпечувати адекватну зміну розміру самого віджета у відповідь на зміни у його наповненні чи вигляді.
Компонування не належать до віджетів, не успадковують від QWidget та є невидимі на формі. Вони лише керують розміром та розміщенням їх вмісту. Найчастіше використовують три основних компонування:
- вертикальне компонування (клас QVBoxLayout);
- горизонтальне компонування (клас QHBoxLayout);
- компонування сіткою (клас QGridLayout);
Для того щоб продемонструвати роботу з компонуваннями, ми створимо новий приклад, додамо кілька елементів та зробимо так, щоб розміщення елементів було пропорційне та відповідало зміні розмірів вікна. Спробуємо створити такий інтерфейс:
- мітки та поля вводу розмістимо горизонтально в одному рядку;
- створимо два таких рядка з мітками та полями;
- додамо ще один рядок з двома кнопками горизонтально, вирівняними за правим краєм вікна.
Створимо проект LayoutExample. Для цього скористаємося майстром нових проектів. Виберемо у списку Qt Gui Application. Задамо назву для проекту та налаштуємо клас головного вікна: задамо батьківський клас (у випадаючому списку Base Class встановимо QWidget) та знімемо прапорець для автоматичної генерації файла форми (Generate Form).
Малюнок 3.13 Створення програми з графічним інтерфейсом користувача.
Відкриємо файл mainwindow.cpp та змінимо код конструктора вікна:
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
MainWindow::MainWindow(QWidget *parent)
: QWidget(parent)
{
// Перший горизонтальний рядок
// Початковий текст у полі вводу
QLineEdit *lLineEdit = new QLineEdit("Text 1");
// Задаємо текст
// & - означає комбінацію клавіш
// для активації віджета
QLabel *lLabel = new QLabel("Line Edit &1");
// Задаємо віджет до якого буде пермикатися
// фокус вводу при натисканні Alt+1
lLabel->setBuddy(lLineEdit);
// Розташовуємо поле вводу та
// мітку у одному рядку.
QHBoxLayout *lHBoxLayout = new QHBoxLayout;
lHBoxLayout->addWidget(lLabel);
lHBoxLayout->addWidget(lLineEdit);
// Другий горизонтальний рядок
QLineEdit *lLineEdit2 = new QLineEdit("Text 2");
QLabel *lLabel2 = new QLabel("Line Edit &2");
lLabel2->setBuddy(lLineEdit2);
QHBoxLayout *lHBoxLayout2 = new QHBoxLayout;
lHBoxLayout2->addWidget(lLabel2);
lHBoxLayout2->addWidget(lLineEdit2);
// Третій ряд віджетів з кнопками
QPushButton *lPushButtonOk = new QPushButton("&Ok");
QPushButton *lPushButtonCancel = new QPushButton("&Cancel");
QHBoxLayout *lHBoxLayout3 = new QHBoxLayout;
// Додаємо елемент-розтягнення
// він займе весь можливий вільний простір
// та "притисне" кнопки до краю
lHBoxLayout3->addStretch();
lHBoxLayout3->addWidget(lPushButtonOk);
lHBoxLayout3->addWidget(lPushButtonCancel);
// Додаємо компонування вертикально у колонку
QVBoxLayout *lVBoxLayout = new QVBoxLayout;
lVBoxLayout->addLayout(lHBoxLayout);
lVBoxLayout->addLayout(lHBoxLayout2);
lVBoxLayout->addLayout(lHBoxLayout3);
// Задаємо компонування для вікна
setLayout(lVBoxLayout);
}
Після запуску програми отримаємо головне вікно з розміщеними у компонуваннях віджетами.
Малюнок Приклад використання горизонтального та вертикального компонувань.