07 void FindFileDialog::resizeEvent(QResizeEvent * /* event */)
08 {
09 int extraWidth = width - minimumWidth;
10 int extraHeight = height - minimumHeight;
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 }
Мы устанавливаем в конструкторе
Точно так же, как при абсолютном позиционировании, при ручной компоновке в программе приходится жестко задавать много констант, рассчитываемых программистом. Написание подобной программы представляет собой нудное занятие, особенно если проект изменяется. И все-таки существует риск отсечения текста. Этого риска можно избежать, принимая во внимание идеальные размеры дочерних виджетов, но это еще больше усложняет программу.
Самый удобный метод компоновки виджетов на форме — использование менеджеров компоновки Qt. Менеджеры компоновки обеспечивают осмысленные, принимаемые по умолчанию значения параметров для каждого типа виджета и учитывают идеальный размер каждого виджета, который, в свою очередь, обычно зависит от шрифта виджета, его стиля и содержимого. Менеджеры компоновки также учитывают максимальные и минимальные размеры и автоматически подстраивают компоновку в ответ на изменения шрифта, изменения содержимого и изменения размеров окна.
Существует три наиболее важных менеджера компоновки:
Ниже приводится программный код
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);