Опубликован: 07.03.2015 | Уровень: для всех | Доступ: свободно | ВУЗ: Компания ALT Linux
Лекция 13:

Создание графического интерфейса средствами Qt

13.3 Политики размера (Size Policies)

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

Политики размера задают вызовом метода setSizePolicy() класса QWidget. Метод принимает значение для горизонтальной и вертикальной политики изменения размера. Метод sizeHint() возвращает оптимальный размер (класс QSize), который был определён для виджета. Ниже приведены возможные значения настройки политик размера:

  • QSizePolicy::Fixed — sizeHint определяет размеры элемента. Размеры элемента фиксированы;
  • QSizePolicy::Minimum — sizeHint определяет минимально возможные размеры;
  • QSizePolicy::Maximum — sizeHint определяет максимально возможные размеры;
  • QSizePolicy::Preferred — sizeHint определяет рекомендованные размеры для элемента;
  • QSizePolicy::Expanding — так же как Preferred с тенденцией к увеличению размера;
  • QSizePolicy::MinimumExpanding — так же как Minimum с тенденцией к увеличению размера;
  • QSizePolicy::Ignored — sizeHint будет игнорирован, элемент должен занимать столько места на форме, сколько возможно.

В предыдущем примере кнопки имеют фиксированный вертикальный размер. Для того, чтобы размеры кнопок менялись как горизонтально так и вертикально, добавим настройки политик размера метода createWidgets().

void CalculatorMainWindow::createwidgets ( )
{
	.....
//Зададим политики размера для кнопок: горизонтальное и вертикальное изменение размера
pushButton->setSizePolicy ( QsizePolicy::Preferred, QsizePolicy::Preferred );
pushButton_2->setSizePolicy ( QsizePolicy::Preferred, QsizePolicy::Preferred );
pushButton_3->setSizePolicy ( QsizePolicy::Preferred, QsizePolicy::Preferred );
pushButton_4->setSizePolicy ( QsizePolicy::Preferred, QsizePolicy::Preferred );
pushButton_5->setSizePolicy ( QsizePolicy::Preferred, QsizePolicy::Preferred );
pushButton_6->setSizePolicy ( QsizePolicy::Preferred, QsizePolicy::Preferred );
pushButton_7->setSizePolicy ( QsizePolicy::Preferred, QsizePolicy::Preferred );
pushButton_8->setSizePolicy ( QsizePolicy::Preferred, QsizePolicy::Preferred );
pushButton_9->setSizePolicy ( QsizePolicy::Preferred, QsizePolicy::Preferred );
pushButton_10->seSsizePolicy ( QsizePolicy::Preferred, QsizePolicy::Preferred );
pushButtonC->setSizePolicy ( QsizePolicy::Preferred, QsizePolicy::Preferred );
pushButtonPlus->setSizePolicy ( QsizePolicy::Preferred, QsizePolicy::Preferred );
}

Также размеры виджета можно жёстко ограничивать с помощью методов setMaximumSize() (контролирует максимальный размер элемента интерфейса) и setMinimumSize() (контролирует минимальный размер). В качестве параметра они принимают объект класса QSize, содержащий размеры элемента. Для удобства можно использовать также методы setMinimumWidth(), setMinimumHeight(), setMaximumWidth(), setMaximumHeight() для задания минимальной ширины и высоты, а также максимальной ширины и высоты. Зададим фиксированный вертикальный размер для визуального элемента lcdNumber:

void CalculatorMainWindow::createwidgets ( )
{
	...
	lcdNumber->setFixedHeight ( 5 0 );
}

Результат изменения политик размера показан на рис. 13.6.

Графический интерфейс программы-калькулятора.

Рис. 13.6. Графический интерфейс программы-калькулятора.
Сергей Радыгин
Сергей Радыгин

Символы кириллицы выводит некорректно. Как сделать чтобы выводился читабельный текст на русском языке?

Тип приложения - не Qt,

Qt Creator 4.5.0 основан на Qt 5.10.0. Win7.

 

Юрий Герко
Юрий Герко

Кому удалось собрать пример из раздела 13.2 Компоновка (Layouts)? Если создавать проект по изложенному алгоритму, автоматически не создается  файл mainwindow.cpp. Если создавать этот файл вручную и добавлять в проект, сборка не получается - компилятор сообщает об отсутствии класса MainWindow. Как правильно выполнить пример?