25
26
27
28
35 QGridBox(
const QLayout *l, QWidget *wid) { item_ = QLayoutPrivate::createWidgetItem(l, wid); }
42 bool isEmpty()
const {
return item_->isEmpty(); }
50 QLayoutItem *
item() {
return item_; }
51 void setItem(QLayoutItem *newitem) { item_ = newitem; }
52 QLayoutItem *
takeItem() { QLayoutItem *i = item_; item_ =
nullptr;
return i; }
55 item_->widget()->sizePolicy().horizontalStretch() : 0; }
57 item_->widget()->sizePolicy().verticalStretch() : 0; }
61 friend class QGridLayout;
63 inline int toRow(
int rr)
const {
return torow >= 0 ? torow : rr - 1; }
64 inline int toCol(
int cc)
const {
return tocol >= 0 ? tocol : cc - 1; }
73 Q_DECLARE_PUBLIC(QGridLayout)
88 inline void expand(
int rows,
int cols)
89 { setSize(qMax(rows, rr), qMax(cols, cc)); }
94 inline int rowStretch(
int r)
const {
return rStretch.at(r); }
95 inline int colStretch(
int c)
const {
return cStretch.at(c); }
100 inline int rowSpacing(
int r)
const {
return rMinHeights.at(r); }
101 inline int colSpacing(
int c)
const {
return cMinWidths.at(c); }
103 inline void setReversed(
bool r,
bool c) { hReversed = c; vReversed = r; }
106 inline void setDirty() { needRecalc =
true; hfw_width = -1; }
107 inline bool isDirty()
const {
return needRecalc; }
112 inline void getNextPos(
int &row,
int &col) { row = nextR; col = nextC; }
113 inline int count()
const {
return things.size(); }
116 inline QLayoutItem *
itemAt(
int index)
const {
117 if (index >= 0 && index < things.size())
118 return things.at(index)->item();
124 if (index >= 0 && index < things.size()) {
125 if (
QGridBox *b = things.takeAt(index)) {
127 if (QLayout *l = item->layout()) {
129 if (l->parent() == q)
130 l->setParent(
nullptr);
142 QLayoutItem *item =
nullptr;
151 void getItemPosition(
int index,
int *row,
int *column,
int *rowSpan,
int *columnSpan)
const {
152 if (index >= 0 && index < things.size()) {
153 const QGridBox *b = things.at(index);
154 int toRow = b->toRow(rr);
155 int toCol = b->toCol(cc);
158 *rowSpan = toRow - *row + 1;
159 *columnSpan = toCol - *column +1;
165 void setNextPosAfter(
int r,
int c);
166 void recalcHFW(
int w);
167 void addHfwData(
QGridBox *box,
int width);
169 QSize findSize(
int QLayoutStruct::*,
int hSpacing,
int vSpacing)
const;
171 void setSize(
int rows,
int cols);
173 Qt::Orientation orientation);
174 void setupLayoutData(
int hSpacing,
int vSpacing);
175 void setupHfwLayoutData();
176 void effectiveMargins(
int *left,
int *top,
int *right,
int *bottom)
const;
185 QList<
int> rMinHeights;
186 QList<
int> cMinWidths;
195 int horizontalSpacing;
206 uint addVertical : 1;
209void QGridLayoutPrivate::effectiveMargins(
int *left,
int *top,
int *right,
int *bottom)
const
214 int b = bottomMargin;
216 int leftMost = INT_MAX;
217 int topMost = INT_MAX;
221 QWidget *w =
nullptr;
222 const int n = things.count();
223 for (
int i = 0; i < n; ++i) {
224 QGridBox *box = things.at(i);
225 QLayoutItem *itm = box->item();
228 bool visualHReversed = hReversed != (w->layoutDirection() == Qt::RightToLeft);
229 QRect lir = itm->geometry();
230 QRect wr = w->geometry();
231 if (box->col <= leftMost) {
232 if (box->col < leftMost) {
240 if (visualHReversed) {
241 r = qMax(r, wr.right() - lir.right());
243 l = qMax(l, lir.left() - wr.left());
246 if (box->row <= topMost) {
247 if (box->row < topMost) {
256 b = qMax(b, wr.bottom() - lir.bottom());
258 t = qMax(t, lir.top() - wr.top());
260 if (box->toCol(cc) >= rightMost) {
261 if (box->toCol(cc) > rightMost) {
263 rightMost = box->toCol(cc);
269 if (visualHReversed) {
270 l = qMax(l, lir.left() - wr.left());
272 r = qMax(r, wr.right() - lir.right());
276 if (box->toRow(rr) >= bottomMost) {
277 if (box->toRow(rr) > bottomMost) {
279 bottomMost = box->toRow(rr);
286 t = qMax(t, lir.top() - wr.top());
288 b = qMax(b, wr.bottom() - lir.bottom());
313 horizontalSpacing = -1;
314 verticalSpacing = -1;
319 while (!things.isEmpty())
320 delete things.takeFirst();
326 setupLayoutData(hSpacing, vSpacing);
331
332
333
337
338
339
341 hfwData =
new QList<QLayoutStruct>(rr);
342 setupHfwLayoutData();
347 for (
int r = 0; r < rr; r++) {
348 int spacing = rData.at(r).spacing;
349 h += rData.at(r).sizeHint + spacing;
350 mh += rData.at(r).minimumSize + spacing;
354 hfw_height = qMin(QLAYOUTSIZE_MAX, h);
355 hfw_minheight = qMin(QLAYOUTSIZE_MAX, mh);
360 setupLayoutData(hSpacing, vSpacing);
363 int left, top, right, bottom;
364 effectiveMargins(&left, &top, &right, &bottom);
366 int hMargins = left + right;
367 if (w - hMargins != hfw_width) {
368 qGeomCalc(colData, 0, cc, 0, w - hMargins);
369 recalcHFW(w - hMargins);
371 return hfw_height + top + bottom;
380 effectiveMargins(
nullptr, &top,
nullptr, &bottom);
381 return hfw_minheight + top + bottom;
384QSize
QGridLayoutPrivate::findSize(
int QLayoutStruct::*size,
int hSpacing,
int vSpacing)
const
387 that->setupLayoutData(hSpacing, vSpacing);
392 for (
int r = 0; r < rr; r++)
393 h += rowData.at(r).*size + rowData.at(r).spacing;
394 for (
int c = 0; c < cc; c++)
395 w += colData.at(c).*size + colData.at(c).spacing;
397 w = qMin(QLAYOUTSIZE_MAX, w);
398 h = qMin(QLAYOUTSIZE_MAX, h);
406 that->setupLayoutData(hSpacing, vSpacing);
407 Qt::Orientations ret;
409 for (
int r = 0; r < rr; r++) {
410 if (rowData.at(r).expansive) {
415 for (
int c = 0; c < cc; c++) {
416 if (colData.at(c).expansive) {
417 ret |= Qt::Horizontal;
426 return findSize(&QLayoutStruct::sizeHint, hSpacing, vSpacing);
431 return findSize(&QLayoutStruct::maximumSize, hSpacing, vSpacing);
436 return findSize(&QLayoutStruct::minimumSize, hSpacing, vSpacing);
441 if ((
int)rowData.size() < r) {
442 int newR = qMax(r, rr * 2);
443 rowData.resize(newR);
444 rStretch.resize(newR);
445 rMinHeights.resize(newR);
446 for (
int i = rr; i < newR; i++) {
448 rowData[i].maximumSize = 0;
455 if ((
int)colData.size() < c) {
456 int newC = qMax(c, cc * 2);
457 colData.resize(newC);
458 cStretch.resize(newC);
459 cMinWidths.resize(newC);
460 for (
int i = cc; i < newC; i++) {
462 colData[i].maximumSize = 0;
470 if (hfwData && (
int)hfwData->size() < r) {
482 if (col > nextC || (col == nextC && row >= nextR)) {
491 if (row > nextR || (row == nextR && col >= nextC)) {
505 box->row = box->torow = row;
506 box->col = box->tocol = col;
509 setNextPosAfter(row, col);
514 if (Q_UNLIKELY(row2 >= 0 && row2 < row1))
515 qWarning(
"QGridLayout: Multi-cell fromRow greater than toRow");
516 if (Q_UNLIKELY(col2 >= 0 && col2 < col1))
517 qWarning(
"QGridLayout: Multi-cell fromCol greater than toCol");
518 if (row1 == row2 && col1 == col2) {
522 expand(qMax(row1, row2) + 1
, qMax(col1, col2) + 1
);
534 setNextPosAfter(row2, col2);
539 const QWidget *widget = box
->item()->widget();
546 if (!cStretch.at(box->col))
552 box->expandingDirections() & Qt::Horizontal, box
->isEmpty());
556 if (!rStretch.at(box->row))
562 box->expandingDirections() & Qt::Vertical, box
->isEmpty());
568 for (
int i = start; i <= end; i++) {
577 int sizeHint,
QList<
int> &stretchArray,
int stretch)
584 for (i = start; i <= end; i++) {
589 if (stretchArray.at(i) == 0)
602
603
604
605
606
607
608 qGeomCalc(chain, start, end - start + 1, 0, minSize);
610 for (i = start; i <= end; i++) {
612 int nextPos = (i == end) ? minSize : chain.at(i + 1).pos;
613 int realSize = nextPos - pos;
622 }
else if (w < minSize) {
623 qGeomCalc(chain, start, end - start + 1, 0, minSize);
624 for (i = start; i <= end; i++) {
632 qGeomCalc(chain, start, end - start + 1, 0, sizeHint);
633 for (i = start; i <= end; i++) {
644 if (orientation == Qt::Horizontal)
646 return grid[(r * cc) + c];
650 int fixedSpacing, Qt::Orientation orientation)
656 if (orientation == Qt::Horizontal) {
657 qSwap(numRows, numColumns);
660 QStyle *style =
nullptr;
661 if (fixedSpacing < 0) {
662 if (QWidget *parentWidget = q->parentWidget())
663 style = parentWidget->style();
666 for (
int c = 0; c < numColumns; ++c) {
668 int previousRow = -1;
670 for (
int r = 0; r < numRows; ++r) {
671 if (chain.at(r).empty)
674 QGridBox *box = gridAt(grid, r, c, cc, orientation);
675 if (previousRow != -1 && (!box || previousBox != box)) {
676 int spacing = fixedSpacing;
678 QSizePolicy::ControlTypes controlTypes1 = QSizePolicy::DefaultType;
679 QSizePolicy::ControlTypes controlTypes2 = QSizePolicy::DefaultType;
681 controlTypes1 = previousBox
->item()->controlTypes();
683 controlTypes2 = box
->item()->controlTypes();
685 if ((orientation == Qt::Horizontal && hReversed)
686 || (orientation == Qt::Vertical && vReversed))
687 qSwap(controlTypes1, controlTypes2);
690 spacing = style->combinedLayoutSpacing(controlTypes1, controlTypes2,
691 orientation,
nullptr, q->parentWidget());
693 if (orientation == Qt::Vertical) {
694 QGridBox *sibling = vReversed ? previousBox : box;
699 QWidget *wid = sibling->item()->widget();
701 spacing = qMax(spacing, sibling->item()->geometry().top() - wid->geometry().top());
707 if (spacing > chain.at(previousRow).spacing)
708 chain[previousRow].spacing = spacing;
723#ifndef QT_LAYOUT_DISABLE_CACHING
730 for (i = 0; i < rr; i++) {
731 rowData[i].init(rStretch.at(i), rMinHeights.at(i));
732 rowData[i].maximumSize = rStretch.at(i) ? QLAYOUTSIZE_MAX : rMinHeights.at(i);
734 for (i = 0; i < cc; i++) {
735 colData[i].init(cStretch.at(i), cMinWidths.at(i));
736 colData[i].maximumSize = cStretch.at(i) ? QLAYOUTSIZE_MAX : cMinWidths.at(i);
739 int n = things.size();
740 QVarLengthArray<QGridLayoutSizeTriple> sizes(n);
742 bool has_multi =
false;
745
746
747
748 QVarLengthArray<QGridBox *> grid(rr * cc);
749 memset(grid.data(), 0, rr * cc *
sizeof(
QGridBox *));
752
753
754
755 for (i = 0; i < n; ++i) {
756 QGridBox *
const box = things.at(i);
757 sizes[i].minS = box->minimumSize();
758 sizes[i].hint = box->sizeHint();
759 sizes[i].maxS = box->maximumSize();
764 if (box->row == box->toRow(rr)) {
765 addData(box, sizes[i],
true,
false);
767 initEmptyMultiBox(rowData, box->row, box->toRow(rr));
771 if (box->col == box->toCol(cc)) {
772 addData(box, sizes[i],
false,
true);
774 initEmptyMultiBox(colData, box->col, box->toCol(cc));
778 for (
int r = box->row; r <= box->toRow(rr); ++r) {
779 for (
int c = box->col; c <= box->toCol(cc); ++c) {
780 gridAt(grid.data(), r, c, cc) = box;
785 setupSpacings(colData, grid.data(), hSpacing, Qt::Horizontal);
786 setupSpacings(rowData, grid.data(), vSpacing, Qt::Vertical);
789
790
791
792
794 for (i = 0; i < n; ++i) {
795 QGridBox *
const box = things.at(i);
797 if (box->row != box->toRow(rr))
798 distributeMultiBox(rowData, box->row, box->toRow(rr), sizes[i].minS.height(),
800 if (box->col != box->toCol(cc))
801 distributeMultiBox(colData, box->col, box->toCol(cc), sizes[i].minS.width(),
806 for (i = 0; i < rr; i++)
807 rowData[i].expansive = rowData.at(i).expansive || rowData.at(i).stretch > 0;
808 for (i = 0; i < cc; i++)
809 colData[i].expansive = colData.at(i).expansive || colData.at(i).stretch > 0;
811 q->getContentsMargins(&leftMargin, &topMargin, &rightMargin, &bottomMargin);
821 rData[box->row].sizeHint = qMax(hint, rData.at(box->row).sizeHint);
822 rData[box->row].minimumSize = qMax(hint, rData.at(box->row).minimumSize);
824 QSize hint = box->sizeHint();
825 QSize minS = box->minimumSize();
826 rData[box->row].sizeHint = qMax(hint.height(), rData.at(box->row).sizeHint);
827 rData[box->row].minimumSize = qMax(minS.height(), rData.at(box->row).minimumSize);
832
833
834
835
839 for (
int i = 0; i < rr; i++) {
840 rData[i] = rowData.at(i);
841 rData[i].minimumSize = rData[i].sizeHint = rMinHeights.at(i);
844 for (
int pass = 0; pass < 2; ++pass) {
845 for (
int i = 0; i < things.size(); ++i) {
849 int r2 = box->toRow(rr);
850 int c2 = box->toCol(cc);
851 int w = colData.at(c2).pos + colData.at(c2).size - colData.at(c1).pos;
860 QSize hint = box->sizeHint();
861 QSize min = box->minimumSize();
864 if (hfwh > hint.height())
865 hint.setHeight(hfwh);
866 if (hfwh > min.height())
869 distributeMultiBox(rData, r1, r2, min.height(), hint.height(),
875 for (
int i = 0; i < rr; i++)
876 rData[i].expansive = rData.at(i).expansive || rData.at(i).stretch > 0;
882 bool visualHReversed = hReversed;
883 QWidget *parent = q->parentWidget();
884 if (parent && parent->isRightToLeft())
885 visualHReversed = !visualHReversed;
887 setupLayoutData(hSpacing, vSpacing);
889 int left, top, right, bottom;
890 effectiveMargins(&left, &top, &right, &bottom);
891 r.adjust(+left, +top, -right, -bottom);
893 qGeomCalc(colData, 0, cc, r.x(), r.width());
896 recalcHFW(r.width());
897 qGeomCalc(*hfwData, 0, rr, r.y(), r.height());
900 qGeomCalc(rowData, 0, rr, r.y(), r.height());
906 bool reverse = ((r.bottom() > rect.bottom()) || (r.bottom() == rect.bottom()
907 && ((r.right() > rect.right()) != visualHReversed)));
908 int n = things.size();
909 for (i = 0; i < n; ++i) {
910 QGridBox *box = things.at(reverse ? n-i-1 : i);
911 int r2 = box->toRow(rr);
912 int c2 = box->toCol(cc);
914 int x = colData.at(box->col).pos;
915 int y = rData.at(box->row).pos;
916 int x2p = colData.at(c2).pos + colData.at(c2).size;
917 int y2p = rData.at(r2).pos + rData.at(r2).size;
922 x = r.left() + r.right() - x - w + 1;
924 y = r.top() + r.bottom() - y - h + 1;
926 box->setGeometry(QRect(x, y, w, h));
932 if (row < 0 || row >= rr || col < 0 || col >= cc)
936 if (has_hfw && hfwData)
940 return QRect(colData.at(col).pos, rDataPtr->at(row).pos,
941 colData.at(col).size, rDataPtr->at(row).size);
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034QGridLayout::QGridLayout(QWidget *parent)
1035 : QLayout(*
new QGridLayoutPrivate,
nullptr, parent)
1042
1043
1044
1045
1046
1047
1048
1050void QGridLayout::setDefaultPositioning(
int n, Qt::Orientation orient)
1053 if (orient == Qt::Horizontal) {
1055 d->addVertical =
false;
1058 d->addVertical =
true;
1064
1065
1066
1067
1068
1069QGridLayout::~QGridLayout()
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086void QGridLayout::setHorizontalSpacing(
int spacing)
1089 d->horizontalSpacing = spacing;
1093int QGridLayout::horizontalSpacing()
const
1095 Q_D(
const QGridLayout);
1096 if (d->horizontalSpacing >= 0) {
1097 return d->horizontalSpacing;
1099 return qSmartSpacing(
this, QStyle::PM_LayoutHorizontalSpacing);
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114void QGridLayout::setVerticalSpacing(
int spacing)
1117 d->verticalSpacing = spacing;
1121int QGridLayout::verticalSpacing()
const
1123 Q_D(
const QGridLayout);
1124 if (d->verticalSpacing >= 0) {
1125 return d->verticalSpacing;
1127 return qSmartSpacing(
this, QStyle::PM_LayoutVerticalSpacing);
1132
1133
1134
1135
1136
1137void QGridLayout::setSpacing(
int spacing)
1140 d->horizontalSpacing = d->verticalSpacing = spacing;
1145
1146
1147
1148
1149
1150int QGridLayout::spacing()
const
1152 int hSpacing = horizontalSpacing();
1153 if (hSpacing == verticalSpacing()) {
1161
1162
1163int QGridLayout::rowCount()
const
1165 Q_D(
const QGridLayout);
1166 return d->numRows();
1170
1171
1172int QGridLayout::columnCount()
const
1174 Q_D(
const QGridLayout);
1175 return d->numCols();
1179
1180
1181QSize QGridLayout::sizeHint()
const
1183 Q_D(
const QGridLayout);
1184 QSize result(d->sizeHint(horizontalSpacing(), verticalSpacing()));
1185 int left, top, right, bottom;
1186 d->effectiveMargins(&left, &top, &right, &bottom);
1187 result += QSize(left + right, top + bottom);
1192
1193
1194QSize QGridLayout::minimumSize()
const
1196 Q_D(
const QGridLayout);
1197 QSize result(d->minimumSize(horizontalSpacing(), verticalSpacing()));
1198 int left, top, right, bottom;
1199 d->effectiveMargins(&left, &top, &right, &bottom);
1200 result += QSize(left + right, top + bottom);
1205
1206
1207QSize QGridLayout::maximumSize()
const
1209 Q_D(
const QGridLayout);
1211 QSize s = d->maximumSize(horizontalSpacing(), verticalSpacing());
1212 int left, top, right, bottom;
1213 d->effectiveMargins(&left, &top, &right, &bottom);
1214 s += QSize(left + right, top + bottom);
1215 s = s.boundedTo(QSize(QLAYOUTSIZE_MAX, QLAYOUTSIZE_MAX));
1216 if (alignment() & Qt::AlignHorizontal_Mask)
1217 s.setWidth(QLAYOUTSIZE_MAX);
1218 if (alignment() & Qt::AlignVertical_Mask)
1219 s.setHeight(QLAYOUTSIZE_MAX);
1224
1225
1226bool QGridLayout::hasHeightForWidth()
const
1228 return const_cast<QGridLayout*>(
this)->d_func()->hasHeightForWidth(horizontalSpacing(), verticalSpacing());
1232
1233
1234int QGridLayout::heightForWidth(
int w)
const
1236 Q_D(
const QGridLayout);
1237 QGridLayoutPrivate *dat =
const_cast<QGridLayoutPrivate *>(d);
1238 return dat->heightForWidth(w, horizontalSpacing(), verticalSpacing());
1242
1243
1244int QGridLayout::minimumHeightForWidth(
int w)
const
1246 Q_D(
const QGridLayout);
1247 QGridLayoutPrivate *dat =
const_cast<QGridLayoutPrivate *>(d);
1248 return dat->minimumHeightForWidth(w, horizontalSpacing(), verticalSpacing());
1252
1253
1254int QGridLayout::count()
const
1256 Q_D(
const QGridLayout);
1262
1263
1264QLayoutItem *QGridLayout::itemAt(
int index)
const
1266 Q_D(
const QGridLayout);
1267 return d->itemAt(index);
1271
1272
1273
1274
1275
1276
1277
1278QLayoutItem *QGridLayout::itemAtPosition(
int row,
int column)
const
1280 Q_D(
const QGridLayout);
1281 int n = d->things.size();
1282 for (
int i = 0; i < n; ++i) {
1283 QGridBox *box = d->things.at(i);
1284 if (row >= box->row && row <= box->toRow(d->rr)
1285 && column >= box->col && column <= box->toCol(d->cc)) {
1293
1294
1295QLayoutItem *QGridLayout::takeAt(
int index)
1298 return d->takeAt(index);
1302
1303
1304
1305
1306
1307
1308
1309
1310void QGridLayout::getItemPosition(
int index,
int *row,
int *column,
int *rowSpan,
int *columnSpan)
const
1312 Q_D(
const QGridLayout);
1313 d->getItemPosition(index, row, column, rowSpan, columnSpan);
1318
1319
1320void QGridLayout::setGeometry(
const QRect &rect)
1323 if (d->isDirty() || rect != geometry()) {
1324 QRect cr = alignment() ? alignmentRect(rect) : rect;
1325 d->distribute(cr, horizontalSpacing(), verticalSpacing());
1326 QLayout::setGeometry(rect);
1331
1332
1333
1334
1335
1336
1337
1338
1339QRect QGridLayout::cellRect(
int row,
int column)
const
1341 Q_D(
const QGridLayout);
1342 return d->cellRect(row, column);
1346
1347
1348void QGridLayout::addItem(QLayoutItem *item)
1352 d->getNextPos(r, c);
1353 addItem(item, r, c);
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366void QGridLayout::addItem(QLayoutItem *item,
int row,
int column,
int rowSpan,
int columnSpan, Qt::Alignment alignment)
1369 QGridBox *b =
new QGridBox(item);
1370 b->setAlignment(alignment);
1371 d->add(b, row, (rowSpan < 0) ? -1 : row + rowSpan - 1, column, (columnSpan < 0) ? -1 : column + columnSpan - 1);
1376
1377
1378
1379
1380
1381
1382
1383void QGridLayout::addWidget(QWidget *widget,
int row,
int column, Qt::Alignment alignment)
1386 if (!d->checkWidget(widget))
1388 if (Q_UNLIKELY(row < 0 || column < 0)) {
1389 qWarning(
"QGridLayout: Cannot add %s/%s to %s/%s at row %d column %d",
1390 widget->metaObject()->className(), widget->objectName().toLocal8Bit().data(),
1391 metaObject()->className(), objectName().toLocal8Bit().data(), row, column);
1394 addChildWidget(widget);
1395 QWidgetItem *b = QLayoutPrivate::createWidgetItem(
this, widget);
1396 addItem(b, row, column, 1, 1, alignment);
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411void QGridLayout::addWidget(QWidget *widget,
int fromRow,
int fromColumn,
1412 int rowSpan,
int columnSpan, Qt::Alignment alignment)
1415 if (!d->checkWidget(widget))
1417 int toRow = (rowSpan < 0) ? -1 : fromRow + rowSpan - 1;
1418 int toColumn = (columnSpan < 0) ? -1 : fromColumn + columnSpan - 1;
1419 addChildWidget(widget);
1420 QGridBox *b =
new QGridBox(
this, widget);
1421 b->setAlignment(alignment);
1422 d->add(b, fromRow, toRow, fromColumn, toColumn);
1427
1428
1429
1430
1431
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447void QGridLayout::addLayout(QLayout *layout,
int row,
int column, Qt::Alignment alignment)
1450 if (!d->checkLayout(layout))
1452 if (!adoptLayout(layout))
1454 QGridBox *b =
new QGridBox(layout);
1455 b->setAlignment(alignment);
1456 d->add(b, row, column);
1460
1461
1462
1463
1464
1465
1466
1467
1468void QGridLayout::addLayout(QLayout *layout,
int row,
int column,
1469 int rowSpan,
int columnSpan, Qt::Alignment alignment)
1472 if (!d->checkLayout(layout))
1474 if (!adoptLayout(layout))
1476 QGridBox *b =
new QGridBox(layout);
1477 b->setAlignment(alignment);
1478 d->add(b, row, (rowSpan < 0) ? -1 : row + rowSpan - 1, column, (columnSpan < 0) ? -1 : column + columnSpan - 1);
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494void QGridLayout::setRowStretch(
int row,
int stretch)
1497 d->setRowStretch(row, stretch);
1502
1503
1504
1505
1506int QGridLayout::rowStretch(
int row)
const
1508 Q_D(
const QGridLayout);
1509 return d->rowStretch(row);
1513
1514
1515
1516
1517int QGridLayout::columnStretch(
int column)
const
1519 Q_D(
const QGridLayout);
1520 return d->colStretch(column);
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540void QGridLayout::setColumnStretch(
int column,
int stretch)
1543 d->setColStretch(column, stretch);
1550
1551
1552
1553
1554void QGridLayout::setRowMinimumHeight(
int row,
int minSize)
1557 d->setRowMinimumHeight(row, minSize);
1562
1563
1564
1565
1566int QGridLayout::rowMinimumHeight(
int row)
const
1568 Q_D(
const QGridLayout);
1569 return d->rowSpacing(row);
1573
1574
1575
1576
1577void QGridLayout::setColumnMinimumWidth(
int column,
int minSize)
1580 d->setColumnMinimumWidth(column, minSize);
1585
1586
1587
1588
1589int QGridLayout::columnMinimumWidth(
int column)
const
1591 Q_D(
const QGridLayout);
1592 return d->colSpacing(column);
1596
1597
1598Qt::Orientations QGridLayout::expandingDirections()
const
1600 Q_D(
const QGridLayout);
1601 return d->expandingDirections(horizontalSpacing(), verticalSpacing());
1605
1606
1607void QGridLayout::setOriginCorner(Qt::Corner corner)
1610 d->setReversed(corner == Qt::BottomLeftCorner || corner == Qt::BottomRightCorner,
1611 corner == Qt::TopRightCorner || corner == Qt::BottomRightCorner);
1615
1616
1617
1618Qt::Corner QGridLayout::originCorner()
const
1620 Q_D(
const QGridLayout);
1621 if (d->horReversed()) {
1622 return d->verReversed() ? Qt::BottomRightCorner : Qt::TopRightCorner;
1624 return d->verReversed() ? Qt::BottomLeftCorner : Qt::TopLeftCorner;
1629
1630
1631void QGridLayout::invalidate()
1635 QLayout::invalidate();
1640#include "moc_qgridlayout.cpp"
Qt::Alignment alignment() const
void setAlignment(Qt::Alignment a)
Qt::Orientations expandingDirections() const
void setGeometry(const QRect &r)
QSize maximumSize() const
QSize minimumSize() const
void setItem(QLayoutItem *newitem)
QGridBox(QLayoutItem *lit)
QGridBox(const QLayout *l, QWidget *wid)
bool hasHeightForWidth() const
int heightForWidth(int w) const
int colSpacing(int c) const
void distribute(QRect rect, int hSpacing, int vSpacing)
QLayoutItem * replaceAt(int index, QLayoutItem *newitem) override
QRect cellRect(int row, int col) const
void setRowStretch(int r, int s)
void setRowMinimumHeight(int r, int s)
void setReversed(bool r, bool c)
void getNextPos(int &row, int &col)
Qt::Orientations expandingDirections(int hSpacing, int vSpacing) const
int rowSpacing(int r) const
void add(QGridBox *, int row, int col)
void expand(int rows, int cols)
QLayoutItem * takeAt(int index)
QLayoutItem * itemAt(int index) const
QSize sizeHint(int hSpacing, int vSpacing) const
bool hasHeightForWidth(int hSpacing, int vSpacing)
void setColStretch(int c, int s)
int colStretch(int c) const
void add(QGridBox *, int row1, int row2, int col1, int col2)
QSize minimumSize(int hSpacing, int vSpacing) const
int minimumHeightForWidth(int width, int hSpacing, int vSpacing)
int rowStretch(int r) const
void setColumnMinimumWidth(int c, int s)
int heightForWidth(int width, int hSpacing, int vSpacing)
void getItemPosition(int index, int *row, int *column, int *rowSpan, int *columnSpan) const
QSize maximumSize(int hSpacing, int vSpacing) const
Combined button and popup list for selecting options.
static void initEmptyMultiBox(QList< QLayoutStruct > &chain, int start, int end)
static void distributeMultiBox(QList< QLayoutStruct > &chain, int start, int end, int minSize, int sizeHint, QList< int > &stretchArray, int stretch)
static QGridBox *& gridAt(QGridBox *grid[], int r, int c, int cc, Qt::Orientation orientation=Qt::Vertical)