Размещение нескольких компонентов в окне

При размещении нескольких компонентов в окне обычно возникает вопрос взаимного расположения компонентов, а также их минимальных размеров. Следует помнить, что по умолчанию размеры окна можно изменить, взявшись мышью на границу окна, а значит необходимо перехватывать событие изменения размеров и производить пересчет позиции и размера каждого компонента. Библиотека Qt избавляет нас от лишних проблем и предоставляет множество компонентов-контейнеров, которые производят перерасчет автоматически. Все, что от нас требуется — это выбрать нужный контейнер, добавить туда компоненты в определенном порядке, а затем поместить контейнер в окно или в другой контейнер.

Абсолютное позиционирование

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

Для перемещения компонента можно воспользоваться методом move(), а для изменения размеров — методом resize(). Выполнить одновременное изменение позиции и размеров позволяет метод setGeometry(). Все эти методы, а также множество других методов, позволяющих изменять позицию и размеры, мы уже рассматривали в разд. 3.3 и 3.4. Если компонент не имеет родителя, то эти методы изменяют характеристики окна, а если при создании компонента указан родительский компонент, то методы изменяют характеристики только самого компонента.

Для примера выведем внутри окна надпись и кнопку, указав позицию и размеры для каждого компонента (листинг 5.1).

Листинг 5.1. Абсолютное позиционирование

#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QPushButton>

int main(int argc, char *argv[])
{
   QApplication app(argc, argv);
   QWidget window;
   window.setWindowTitle("Абсолютное позиционирование");
   window.resize(300, 120);
   QLabel *label = new QLabel("Текст надписи", &window);
   QPushButton *btn1 = new QPushButton("Текст на кнопке", &window);
   label->setGeometry(10, 10, 280, 60);
   btn1->resize(280, 30);
   btn1->move(10, 80);
   window.show();
   return app.exec();
}

Абсолютное позиционирование имеет следующие недостатки:

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

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

Помощь сайту

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

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