Чтение онлайн

ЖАНРЫ

QT 4: программирование GUI на С++

Саммерфилд Марк

Шрифт:

11 namedLabel->setGeometry(9, 9, 50, 25);

12 namedLineEdit->setGeometry(65, 9, 100 + extraWidth, 25);

13 lookInLabel->setGeometry(9, 40, 50, 25);

14 lookInLineEdit->setGeometry(65, 40, 100 + extraWidth, 25);

15 subfoldersCheckBox->setGeometry(9, 71, 156 + extraWidth, 23);

16 tableWidget->setGeometry(9, 100, 156 + extraWidth, 50 + extraHeight);

17 messageLabel->setGeometry(9, 156 + extraHeight, 156 + extraWidth, 25);

18 findButton->setGeometry(171 + extraWidth, 9, 85, 32);

19 stopButton->setGeometry(171 + extraWidth, 47, 85, 32);

20 closeButton->setGeometry(171 + extraWidth, 84, 85, 32);

21 helpButton->setGeometry(171 + extraWidth, 149 + extraHeight, 85, 32);

22 }

Мы

устанавливаем в конструкторе FindFileDialog минимальный размер формы на значение 265 × 190 и ее начальный размер на значение 365 × 240. В обработчике событий resizeEvent мы отдаем все дополнительное пространство виджетам, размеры которых мы хотим увеличить. Это обеспечивает плавное изменение вида формы при изменении пользователем ее размеров.

Рис. 6.2. Изменение размеров диалогового окна, допускающего изменение своих размеров.

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

Самый удобный метод компоновки виджетов на форме — использование менеджеров компоновки Qt. Менеджеры компоновки обеспечивают осмысленные, принимаемые по умолчанию значения параметров для каждого типа виджета и учитывают идеальный размер каждого виджета, который, в свою очередь, обычно зависит от шрифта виджета, его стиля и содержимого. Менеджеры компоновки также учитывают максимальные и минимальные размеры и автоматически подстраивают компоновку в ответ на изменения шрифта, изменения содержимого и изменения размеров окна.

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

Ниже приводится программный код FindFileDialog, в котором используются менеджеры компоновки:

01 FindFileDialog::FindFileDialog(QWidget *parent)

02 : QDialog(parent)

03 {

04 QGridLayout *leftLayout = new QGridLayout;

05 leftLayout->addWidget(namedLabel, 0, 0);

06 leftLayout->addWidget(namedLineEdit, 0, 1);

07 leftLayout->addWidget(lookInLabel, 1, 0);

08 leftLayout->addWidget(lookInLineEdit, 1, 1);

09 leftLayout->addWidget(subfoldersCheckBox, 2, 0, 1, 2);

10 leftLayout->addWidget(tableWidget, 3, 0, 1, 2);

11 leftLayout->addWidget(messageLabel, 4, 0, 1, 2);

12 QVBoxLayout *rightLayout = new QVBoxLayout;

13 rightLayout->addWidget(findButton);

14 rightLayout->addWidget(stopButtpn);

15 rightLayout->addWidget(closeButton);

16 rightLayout->addStretch;

17 rightLayout->addWidget(helpButton);

18 QHBoxLayout *mainLayout = new QHBoxLayout;

19 mainLayout->addLayout(leftLayout);

20 mainLayout->addLayout(rightLayout);

21 setLayout(mainLayout);

22 setWindowTitle(tr("Find Files or Folders"));

23 }

Компоновка

обеспечивается одним менеджером компоновки по горизонтали QHBoxLayout, одним менеджером компоновки в ячейках сетки QGridLayout и одним менеджером компоновки по вертикали QVBoxLayout. Менеджер QGridLayout слева и менеджер QVBoxLayout справа размещаются рядом внутри внешнего менеджера QHBoxLayout. Кромка по периметру диалогового окна и промежуток между дочерними виджетами устанавливаются в значения по умолчанию, которые зависят от текущего стиля виджета; они могут быть изменены, если использовать функции QLayout::setMargin и QLayout::setSpacing.

Такое же диалоговое окно можно было бы создать с помощью визуальных средства разработки Qt Designer, задавая приблизительное положение дочерним виджетам, выделяя те, которые необходимо расположить рядом, и выбирая пункты меню Form | Lay Out Horizontally, Form | Lay Out Vertically или Form | Lay Out in a Grid. Мы использовали данный подход в главе 2 для создания диалоговых окон Go-to-Cell и Sort приложения Электронная таблица.

Рис. 6.3. Компоновка диалогового окна Find File.

Применение QHBoxLayout и QVBoxLayout достаточно очевидное, однако с QGridLayout дело обстоит несколько сложнее. Менеджер QGridLayout работает с двухмерной сеткой ячеек. Текстовая метка QLabel, расположенная в верхнем левом углу этого менеджера компоновки, имеет координаты (0, 0), a соответствующая строка редактирования QLineEdit имеет координаты (0, 1). Флажок QCheckBox размещается в двух столбцах; он занимает ячейки с координатами (2, 0) и (2, 1). Расположенные под ним объекты QTreeWidget и QLabel также занимают два столбца. Вызовы функции addWidget имеют следующий формат:

layout->addWidget(виджeт, cтpoкa, cтoлбeц, колСтрок, колСтолбцов);

Здесь виджет является дочерним виджетом, который вставляется в менеджер компоновки, (строка, столбец) — коррдинаты верхней левой ячейки, занимаемой виджетом, колСтрок — количество строк, занимаемое виджетом, и колСтолбцов — количество столбцов, занимаемое виджетом. Если параметры колСтрок и колСтолбцов не заданы, они принимают значение по умолчанию, равное 1.

Поделиться с друзьями: