Читаем QT 4: программирование GUI на С++ полностью

<p>Глава 6. Управление компоновкой</p>

Каждому размещаемому в форме виджету необходимо задать соответствующие размер и позицию. Qt содержит несколько классов, обеспечивающих компоновку виджетов на форме: QHBoxLayout, QVBoxLayout, QGridLayout и QStackLayout. Эти классы настолько удобно и просто применять, что почти каждый Qt—разработчик их использует либо непосредственно в исходном коде программы, либо через Qt Designer.

Другая причина применения классов Qt по компоновке виджетов — гарантия автоматической адаптации формы к различным шрифтам, языкам и платформам. Если пользователь изменяет настройки шрифта системы, формы приложения немедленно на это отреагируют, изменяя при необходимости свои размеры. И если вы переводите интерфейс пользователя приложения на другие языки, классы компоновки будут учитывать содержание переведенных виджетов, чтобы избежать усечения текста.

К другим классам, управляющим компоновкой, относятся QSplitter, QScrollArea, QMainWindow и QWorkspace. Общая черта этих классов — обеспечение гибкой компоновки виджетов, которой может управлять пользователь. Например, QSplitter обеспечивает наличие разделительной линии, которую пользователь может передвигать для изменения размеров виджетов, a QWorkspace обеспечивает поддержку MDI (multiple document interface — многодокументный интерфейс), позволяющего в главном окне приложения показывать сразу несколько документов. Поскольку эти классы часто используются как альтернатива основным классам компоновки, они также рассматриваются в данной главе.

<p>Компоновка виджетов на форме</p>

Существует три основных способа управления компоновкой дочерних виджетов формы: абсолютное позиционирование, ручная компоновка и применение менеджеров компоновки. Мы рассмотрим по очереди каждый из этих методов, используя в качестве нашего примера диалоговое окно Find File (найти файл), показанное на рис. 6.1.

Рис. 6.1. Окно диалога Find File.

Абсолютное позиционирование является самым негибким способом компоновки виджетов. Он предусматривает жесткое кодирование в программе размеров и позиций дочерних виджетов формы и фиксированный размер самой формы. Ниже показано, какой вид принимает конструктор FindFileDialog при применении абсолютного позиционирования:

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 }

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

• пользователь не может изменить размер окна;

• некоторый текст может оказаться отсеченным, если пользователь выбирает необычно большой шрифт или если приложение переводится на другой язык;

• виджеты могут иметь неправильные размеры для некоторых стилей;

• расчет позиций и размеров должен производиться вручную. Этот процесс утомителен и приводит к ошибкам; кроме того, это сильно затрудняет сопровождение.

В качестве альтернативы абсолютному позиционированию используется ручная компоновка. При ручной компоновке виджетам все же придаются абсолютные позиции, но размеры виджетов становятся пропорциональными размеру окна, а не жестко кодируются в программе. Это может достигаться путем переопределения функции формы resizeEvent для установки геометрических размеров своих дочерних виджетов:

01 FindFileDialog::FindFileDialog(QWidget *parent)

02 : QDialog(parent)

03 {

04 SetMinimumSize(265, 190);

05 resize(365, 240);

06 }

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже