Перерасчёт геометрии в методе resizeEvent (файл examples-qt/03/03.cpp)
1 // Перерасчёт геометрии всех элементов при изменении размеров окна 2 3 #include "03.h" 4 5 MyDialog::MyDialog() { 6 7 QTextCodec *codec = QTextCodec::codecForName("CP1251");
8 QTextCodec::setCodecForTr(codec);
9 10 lb = new QLabel(tr("Метка:"), this);
11 12 le = new QLineEdit(tr("Строка"), this);
13 14 cb = new QComboBox(this);
15 cb->
addItem(tr("Первый"));
16 cb->
addItem(tr("Второй"));
17 cb->
addItem(tr("Третий"));
18 cb->
setCurrentIndex(2);
19 cb->
setEditable(true);
20 cb->
setInsertPolicy(QComboBox::InsertAtBottom);
21 22 sb = new QSpinBox(this);
23 sb->
setValue(5);
24 25 chb = new QCheckBox(tr("Пометка"), this);
26 chb->
setCheckState(Qt::Checked);
27 28 dsb = new QDoubleSpinBox(this);
29 dsb->
setMaximum(200.0);
30 dsb->
setDecimals(2);
31 dsb->
setSingleStep(0.25);
32 dsb->
setValue(100.25);
33 34 dte = new QDateTimeEdit( 35 QDateTime(QDate(2007, 2, 5), QTime(13, 35, 55, 10)), 36 this);
37 38 gb = new QGroupBox(tr("Выбрать одно из трёх:"), this);
39 40 rb1 = new QRadioButton(tr("Один"), gb);
41 42 rb2 = new QRadioButton(tr("Два"), gb);
43 44 rb3 = new QRadioButton(tr("Три"), gb);
45 46 rb2->
setChecked(true);
47 48 btn1 = new QPushButton(tr("Сохранить"), this);
49 50 btn2 = new QPushButton(tr("Отменить"), this);
51 52 setMinimumSize(160, 205);
53 } 54 55 void MyDialog::resizeEvent(QResizeEvent* /* event */ ) { 56 int dw = width() - minimumWidth();
57 int dh = height() - minimumHeight();
58 59 lb->
setGeometry(5, 6, 45, 24);
60 le->
setGeometry(55, 6, 100+dw, 24);
61 62 cb->
setGeometry(5, 36, 80+dw*2/3, 24);
63 sb->
setGeometry(95+dw*2/3, 36, 60+dw/3, 24);
64 65 chb->
setGeometry(5, 65, 70, 24);
66 dsb->
setGeometry(95, 65, 60+dw, 24);
67 68 dte->
setGeometry(5, 95, 150+dw, 24);
69 70 gb->
setGeometry(5, 120, 150+dw, 40);
71 rb1->
setGeometry(5, 15, 45+dw/3, 24);
72 rb2->
setGeometry(55+dw/3, 15, 45+dw/3, 24);
73 rb3->
setGeometry(105+dw*2/3, 15, 45+dw/3, 24);
74 75 btn1->
setGeometry(5+dw/4, 170+dh, 70+dw/4, 29);
76 btn2->
setGeometry(85+dw/2, 170+dh, 70+dw/4, 29);
77 } 78 79 int main(int argc, char *argv[]) { 80 81 QApplication app(argc, argv);
82 83 MyDialog *dlg = new MyDialog();
84 dlg->
show();
85 86 return app.exec();
87 }
Рис. Внешний вид окна и элементов управления в системе Windows при запуске программы с параметром
-style=Windows, WindowsXP, Motif, CDE, Plastique и Cleanlooks
На рис. показано, как изменяется внешний вид элементов диалога, если при запуске программы, текст которой приведён в листингах 8 и 9, указать в командной строке параметр -style=ИмяСтиля. Обратите внимание, что при одних и тех же размерах окна, устанавливаемых сразу после запуска программы, в режиме WindowsXP текстовая метка "Один" оказалась обрезанной на последней букве, а для стиля Motif высота всех полей ввода и ширина кнопок оказалась на грани критической: текстовые надписи еле "влазят" в отведённые для них границы из-за увеличенной толщины декоративных элементов. В системе Linux, где размер шрифта по умолчанию выбирается обычно больше, чем в Windows (из-за традиционно худшего качества отображения шрифтов), это различие компоновки элементов диалога для различных стилей ещё более заметно.