Программирование на C++ с использованием библиотеки Qt4

Менеджеры размещения (файл examples-qt/04/04.cpp)


// Создаём менеджер размещения: 52 QGridLayout *mainlay = new QGridLayout();
// Размер полей вокруг сетки элементов и // интервалы между ячейками сетки: 53 mainlay->
setMargin(2);
54 mainlay->
setSpacing(3);
55 // Размещаем элементы: 56 mainlay->
addWidget(lb, 0, 0);
57 mainlay->
addWidget(le, 0, 1, 1, 2);
58 59 mainlay->
addWidget(cb, 1, 0, 1, 2);
60 mainlay->
addWidget(sb, 1, 2);
61 62 mainlay->
addWidget(chb, 2, 0);
63 mainlay->
addWidget(dsb, 2, 1, 1, 2);
64 65 mainlay->
addWidget(dte, 3, 0, 1, 3);
66 // Менеджер размещения для радиокнопок: 67 QHBoxLayout *hbl = new QHBoxLayout();
68 hbl->
addWidget(rb1, 1);
69 hbl->
addWidget(rb2, 1);
70 hbl->
addWidget(rb3, 1);
71 gb->
setLayout(hbl);
72 mainlay->
addWidget(gb, 4, 0, 1, 3);
73 // Менеджер размещения для кнопок диалога: 74 QHBoxLayout *btns = new QHBoxLayout();
75 btns->
addStretch(1);
76 btns->
addWidget(btn1, 2);
77 btns->
addWidget(btn2, 2);
78 btns->
addStretch(1);
79 mainlay->
addLayout(btns, 6, 0, 1, 3);
80 // Растяжимость колонок и строк: 81 mainlay->
setColumnStretch(1, 1);
82 mainlay->
setColumnStretch(2, 1);
83 mainlay->
setRowStretch(5, 1);
84 setLayout(mainlay);
85 }

Для вставки любого виджета в нужную ячейку QGridLayout предназначен метод addWidget, при вызове которого указываются номер строки и столбца (нумерация начинается с нуля), а также, если требуется, количество соседних строк и столбцов, которые будет занимать элемент. Растяжимостью строк и столбцов сетки управляют методы setRowStretch и setColumnStretch, первый параметр которых указывает номер строки (столбца), а второй -- коэффициент растяжения. Чем он больше, тем сильнее будет растягиваться/сжиматься данная строка по вертикали (или столбец по горизонтали) по сравнению с остальными строками (столбцами) при изменении размеров всего окна.

Разумеется, в данном случае можно предложить и другие варианты, например, на внешнем уровне использовать QVBoxLayout и заполнять его менеджерами QHBoxLayout, в которые вставлять элементы каждой горизонтальной строки диалога, подобно тому, как это сделано с радиокнопками в нашем примере.

Если нас не удовлетворяет то, как ведут себя какие-либо элементы диалога при изменении размеров окна, то можно попытаться вызвать для них метод setSizePolicy, первый параметр которого задаёт политику изменения ширины элемента, а второй -- его высоты. Каждый параметр может принимать одно из значений:

  • QSizePolicy::Fixed -- размер элемента в данном направлении не изменяется;
  • QSizePolicy::Minimum -- "идеальным" размером элемента считается его минимальный размер. Элемент может растягиваться, но не может сжиматься;
  • QSizePolicy::Maximum -- "идеальным" размером элемента считается его максимальный размер. Элемент может сжиматься, но не может растягиваться;
  • QSizePolicy::Preferred -- элемент "старается" поддерживать некоторый предпочтительный для него размер, но при необходимости может растянуться или сжаться;
  • QSizePolicy::Expanding -- элемент "старается" принять максимально возможный доступный ему размер, но при необходимости может и сжиматься.



Содержание раздела