116 Q_Q(
const QBoxLayout);
118 QBoxLayoutItem *leftBox =
nullptr;
119 QBoxLayoutItem *rightBox =
nullptr;
122 leftBox = list.value(0);
123 rightBox = list.value(list.count() - 1);
124 if (dir == QBoxLayout::RightToLeft)
125 qSwap(leftBox, rightBox);
130 QLayoutItem *itm = leftBox->item;
131 if (QWidget *w = itm->widget())
132 leftDelta = itm->geometry().left() - w->geometry().left();
135 QLayoutItem *itm = rightBox->item;
136 if (QWidget *w = itm->widget())
137 rightDelta = w->geometry().right() - itm->geometry().right();
139 QWidget *w = q->parentWidget();
140 Qt::LayoutDirection layoutDirection = w ? w->layoutDirection() : QGuiApplication::layoutDirection();
141 if (layoutDirection == Qt::RightToLeft)
142 qSwap(leftDelta, rightDelta);
144 l = qMax(l, leftDelta);
145 r = qMax(r, rightDelta);
148 int count = top || bottom ? list.count() : 0;
149 for (
int i = 0; i < count; ++i) {
150 QBoxLayoutItem *box = list.at(i);
151 QLayoutItem *itm = box->item;
152 QWidget *w = itm->widget();
154 QRect lir = itm->geometry();
155 QRect wr = w->geometry();
157 t = qMax(t, lir.top() - wr.top());
159 b = qMax(b, wr.bottom() - lir.bottom());
163 QBoxLayoutItem *topBox =
nullptr;
164 QBoxLayoutItem *bottomBox =
nullptr;
167 topBox = list.value(0);
168 bottomBox = list.value(list.count() - 1);
169 if (dir == QBoxLayout::BottomToTop) {
170 qSwap(topBox, bottomBox);
174 QLayoutItem *itm = topBox->item;
175 QWidget *w = itm->widget();
177 t = qMax(t, itm->geometry().top() - w->geometry().top());
180 if (bottom && bottomBox) {
181 QLayoutItem *itm = bottomBox->item;
182 QWidget *w = itm->widget();
184 b = qMax(b, w->geometry().bottom() - itm->geometry().bottom());
188 int count = left || right ? list.count() : 0;
189 for (
int i = 0; i < count; ++i) {
190 QBoxLayoutItem *box = list.at(i);
191 QLayoutItem *itm = box->item;
192 QWidget *w = itm->widget();
194 QRect lir = itm->geometry();
195 QRect wr = w->geometry();
197 l = qMax(l, lir.left() - wr.left());
199 r = qMax(r, wr.right() - lir.right());
225 int maxw = horz(dir) ? 0 : QLAYOUTSIZE_MAX;
226 int maxh = horz(dir) ? QLAYOUTSIZE_MAX : 0;
241 QSizePolicy::ControlTypes controlTypes1;
242 QSizePolicy::ControlTypes controlTypes2;
243 int fixedSpacing = q->spacing();
244 int previousNonEmptyIndex = -1;
246 QStyle *style =
nullptr;
247 if (fixedSpacing < 0) {
248 if (QWidget *parentWidget = q->parentWidget())
249 style = parentWidget->style();
252 for (
int i = 0; i < n; i++) {
254 QSize max = box->item->maximumSize();
255 QSize min = box->item->minimumSize();
256 QSize hint = box->item->sizeHint();
257 Qt::Orientations exp = box
->item->expandingDirections();
258 bool empty = box
->item->isEmpty();
262 if (fixedSpacing >= 0) {
263 spacing = (previousNonEmptyIndex >= 0) ? fixedSpacing : 0;
265 if (!horz(dir) && previousNonEmptyIndex >= 0) {
266 QBoxLayoutItem *sibling = (dir == QBoxLayout::TopToBottom ? box : list.at(previousNonEmptyIndex));
268 QWidget *wid = sibling->item->widget();
270 spacing = qMax(spacing, sibling->item->geometry().top() - wid->geometry().top());
275 controlTypes1 = controlTypes2;
276 controlTypes2 = box
->item->controlTypes();
277 if (previousNonEmptyIndex >= 0) {
278 QSizePolicy::ControlTypes actual1 = controlTypes1;
279 QSizePolicy::ControlTypes actual2 = controlTypes2;
280 if (dir == QBoxLayout::RightToLeft || dir == QBoxLayout::BottomToTop)
281 qSwap(actual1, actual2);
284 spacing = style->combinedLayoutSpacing(actual1, actual2,
285 horz(dir) ? Qt::Horizontal : Qt::Vertical,
286 nullptr, q->parentWidget());
293 if (previousNonEmptyIndex >= 0)
294 a[previousNonEmptyIndex].spacing = spacing;
295 previousNonEmptyIndex = i;
298 bool ignore = empty && box
->item->widget();
301 bool expand = (exp & Qt::Horizontal || box->stretch > 0);
302 horexp = horexp || expand;
303 maxw += spacing + max.width();
304 minw += spacing + min.width();
305 hintw += spacing + hint.width();
307 qMaxExpCalc(maxh, verexp, dummy,
308 max.height(), exp & Qt::Vertical, box->item->isEmpty());
309 minh = qMax(minh, min.height());
310 hinth = qMax(hinth, hint.height());
312 a[i].sizeHint = hint.width();
313 a[i].maximumSize = max.width();
314 a[i].minimumSize = min.width();
315 a[i].expansive = expand;
318 bool expand = (exp & Qt::Vertical || box->stretch > 0);
319 verexp = verexp || expand;
320 maxh += spacing + max.height();
321 minh += spacing + min.height();
322 hinth += spacing + hint.height();
324 qMaxExpCalc(maxw, horexp, dummy,
325 max.width(), exp & Qt::Horizontal, box->item->isEmpty());
326 minw = qMax(minw, min.width());
327 hintw = qMax(hintw, hint.width());
329 a[i].sizeHint = hint.height();
330 a[i].maximumSize = max.height();
331 a[i].minimumSize = min.height();
332 a[i].expansive = expand;
338 hasHfw = hasHfw || box->item->hasHeightForWidth();
343 expanding = (Qt::Orientations)
344 ((horexp ? Qt::Horizontal : 0)
345 | (verexp ? Qt::Vertical : 0));
347 minSize = QSize(minw, minh);
348 maxSize = QSize(maxw, maxh).expandedTo(minSize);
349 sizeHint = QSize(hintw, hinth).expandedTo(minSize).boundedTo(maxSize);
351 q->getContentsMargins(&leftMargin, &topMargin, &rightMargin, &bottomMargin);
352 int left, top, right, bottom;
354 QSize extra(left + right, top + bottom);
735void QBoxLayout::setGeometry(
const QRect &r)
738 if (d->dirty || r != geometry()) {
739 QRect oldRect = geometry();
740 QLayout::setGeometry(r);
743 QRect cr = alignment() ? alignmentRect(r) : r;
745 int left, top, right, bottom;
746 d->effectiveMargins(&left, &top, &right, &bottom);
747 QRect s(cr.x() + left, cr.y() + top,
748 cr.width() - (left + right),
749 cr.height() - (top + bottom));
751 QList<QLayoutStruct> a = d->geomArray;
752 int pos = horz(d->dir) ? s.x() : s.y();
753 int space = horz(d->dir) ? s.width() : s.height();
755 if (d->hasHfw && !horz(d->dir)) {
756 for (
int i = 0; i < n; i++) {
757 QBoxLayoutItem *box = d->list.at(i);
758 if (box->item->hasHeightForWidth()) {
759 int width = qBound(box->item->minimumSize().width(), s.width(), box->item->maximumSize().width());
760 a[i].sizeHint = a[i].minimumSize =
761 box->item->heightForWidth(width);
766 Direction visualDir = d->dir;
767 QWidget *parent = parentWidget();
768 if (parent && parent->isRightToLeft()) {
769 if (d->dir == LeftToRight)
770 visualDir = RightToLeft;
771 else if (d->dir == RightToLeft)
772 visualDir = LeftToRight;
775 qGeomCalc(a, 0, n, pos, space);
777 bool reverse = (horz(visualDir)
778 ? ((r.right() > oldRect.right()) != (visualDir == RightToLeft))
779 : r.bottom() > oldRect.bottom());
780 for (
int j = 0; j < n; j++) {
781 int i = reverse ? n-j-1 : j;
782 QBoxLayoutItem *box = d->list.at(i);
786 box->item->setGeometry(QRect(a.at(i).pos, s.y(), a.at(i).size, s.height()));
789 box->item->setGeometry(QRect(s.left() + s.right() - a.at(i).pos - a.at(i).size + 1,
790 s.y(), a.at(i).size, s.height()));
793 box->item->setGeometry(QRect(s.x(), a.at(i).pos, s.width(), a.at(i).size));
796 box->item->setGeometry(QRect(s.x(),
797 s.top() + s.bottom() - a.at(i).pos - a.at(i).size + 1,
798 s.width(), a.at(i).size));
844void QBoxLayout::insertSpacing(
int index,
int size)
847 index = d->validateIndex(index);
850 b = QLayoutPrivate::createSpacerItem(
this, size, 0, QSizePolicy::Fixed, QSizePolicy::Minimum);
852 b = QLayoutPrivate::createSpacerItem(
this, 0, size, QSizePolicy::Minimum, QSizePolicy::Fixed);
854 QBoxLayoutItem *it =
new QBoxLayoutItem(b);
856 d->list.insert(index, it);
867void QBoxLayout::insertStretch(
int index,
int stretch)
870 index = d->validateIndex(index);
873 b = QLayoutPrivate::createSpacerItem(
this, 0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum);
875 b = QLayoutPrivate::createSpacerItem(
this, 0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding);
877 QBoxLayoutItem *it =
new QBoxLayoutItem(b, stretch);
879 d->list.insert(index, it);
1143void QBoxLayout::setDirection(Direction direction)
1146 if (d->dir == direction)
1148 if (horz(d->dir) != horz(direction)) {
1153 for (
int i = 0; i < d->list.size(); ++i) {
1154 QBoxLayoutItem *box = d->list.at(i);
1156 QSpacerItem *sp = box->item->spacerItem();
1158 if (sp->expandingDirections() == Qt::Orientations{} ) {
1160 QSize s = sp->sizeHint();
1161 sp->changeSize(s.height(), s.width(),
1162 horz(direction) ? QSizePolicy::Fixed:QSizePolicy::Minimum,
1163 horz(direction) ? QSizePolicy::Minimum:QSizePolicy::Fixed);
1167 if (horz(direction))
1168 sp->changeSize(0, 0, QSizePolicy::Expanding,
1169 QSizePolicy::Minimum);
1171 sp->changeSize(0, 0, QSizePolicy::Minimum,
1172 QSizePolicy::Expanding);