К этому моменту у нас достаточно знаний для написания законченных приложений с графическим интерфейсом с помощью средств разработки Qt. В частях II и III мы проведем более глубокое исследование Qt, чтобы можно было в полной мере использовать возможности Qt.
Часть II. Средний уровень Qt—программирования
Глава 6. Управление компоновкой
Каждому размещаемому в форме виджету необходимо задать соответствующие размер и позицию. Qt содержит несколько классов, обеспечивающих компоновку виджетов на форме:
Другая причина применения классов Qt по компоновке виджетов — гарантия автоматической адаптации формы к различным шрифтам, языкам и платформам. Если пользователь изменяет настройки шрифта системы, формы приложения немедленно на это отреагируют, изменяя при необходимости свои размеры. И если вы переводите интерфейс пользователя приложения на другие языки, классы компоновки будут учитывать содержание переведенных виджетов, чтобы избежать усечения текста.
К другим классам, управляющим компоновкой, относятся
Компоновка виджетов на форме
Существует три основных способа управления компоновкой дочерних виджетов формы: абсолютное позиционирование, ручная компоновка и применение менеджеров компоновки. Мы рассмотрим по очереди каждый из этих методов, используя в качестве нашего примера диалоговое окно Find File (найти файл), показанное на рис. 6.1.
Абсолютное позиционирование является самым негибким способом компоновки виджетов. Он предусматривает жесткое кодирование в программе размеров и позиций дочерних виджетов формы и фиксированный размер самой формы. Ниже показано, какой вид принимает конструктор
01 FindFileDialog::FindFileDialog(QWidget *parent)
02 : QDialog(parent)
03 {
04 namedLabel->setGeometry(9, 9, 50, 25);
05 namedLineEdit->setGeometry(65, 9, 200, 25);
06 lookInLabel->setGeometry(9, 40, 50, 25);
07 lookInLineEdit->setGeometry(65, 40, 200, 25);
08 subfoldersCheckBox->setGeometry(9, 71, 256, 23);
09 tableWidget->setGeometry(9, 100, 256, 100);
10 messageLabel->setGeometry(9, 206, 256, 25);
11 findButton->setGeometry(271, 9, 85, 32);
12 stopButton->setGeometry(271, 47, 85, 32);
13 closeButton->setGeometry(271, 84, 85, 32);
14 helpButton->setGeometry(271, 199, 85, 32);
15 setWindowTitle(tr("Find Files or Folders"));
16 setFixedSize(365, 240);
17 }
Абсолютное позиционирование имеет много недостатков:
• пользователь не может изменить размер окна;
• некоторый текст может оказаться отсеченным, если пользователь выбирает необычно большой шрифт или если приложение переводится на другой язык;
• виджеты могут иметь неправильные размеры для некоторых стилей;
• расчет позиций и размеров должен производиться вручную. Этот процесс утомителен и приводит к ошибкам; кроме того, это сильно затрудняет сопровождение.