[2] | 1 | /****************************************************************************
|
---|
| 2 | **
|
---|
[651] | 3 | ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
---|
[561] | 4 | ** All rights reserved.
|
---|
| 5 | ** Contact: Nokia Corporation ([email protected])
|
---|
[2] | 6 | **
|
---|
| 7 | ** This file is part of the QtGui module of the Qt Toolkit.
|
---|
| 8 | **
|
---|
| 9 | ** $QT_BEGIN_LICENSE:LGPL$
|
---|
| 10 | ** Commercial Usage
|
---|
| 11 | ** Licensees holding valid Qt Commercial licenses may use this file in
|
---|
| 12 | ** accordance with the Qt Commercial License Agreement provided with the
|
---|
| 13 | ** Software or, alternatively, in accordance with the terms contained in
|
---|
| 14 | ** a written agreement between you and Nokia.
|
---|
| 15 | **
|
---|
| 16 | ** GNU Lesser General Public License Usage
|
---|
| 17 | ** Alternatively, this file may be used under the terms of the GNU Lesser
|
---|
| 18 | ** General Public License version 2.1 as published by the Free Software
|
---|
| 19 | ** Foundation and appearing in the file LICENSE.LGPL included in the
|
---|
| 20 | ** packaging of this file. Please review the following information to
|
---|
| 21 | ** ensure the GNU Lesser General Public License version 2.1 requirements
|
---|
| 22 | ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
---|
| 23 | **
|
---|
[561] | 24 | ** In addition, as a special exception, Nokia gives you certain additional
|
---|
| 25 | ** rights. These rights are described in the Nokia Qt LGPL Exception
|
---|
| 26 | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
---|
[2] | 27 | **
|
---|
| 28 | ** GNU General Public License Usage
|
---|
| 29 | ** Alternatively, this file may be used under the terms of the GNU
|
---|
| 30 | ** General Public License version 3.0 as published by the Free Software
|
---|
| 31 | ** Foundation and appearing in the file LICENSE.GPL included in the
|
---|
| 32 | ** packaging of this file. Please review the following information to
|
---|
| 33 | ** ensure the GNU General Public License version 3.0 requirements will be
|
---|
| 34 | ** met: http://www.gnu.org/copyleft/gpl.html.
|
---|
| 35 | **
|
---|
[561] | 36 | ** If you have questions regarding the use of this file, please contact
|
---|
| 37 | ** Nokia at [email protected].
|
---|
[2] | 38 | ** $QT_END_LICENSE$
|
---|
| 39 | **
|
---|
| 40 | ****************************************************************************/
|
---|
| 41 |
|
---|
| 42 | #include "qgridlayout.h"
|
---|
| 43 | #include "qapplication.h"
|
---|
| 44 | #include "qwidget.h"
|
---|
| 45 | #include "qlist.h"
|
---|
| 46 | #include "qsizepolicy.h"
|
---|
| 47 | #include "qvector.h"
|
---|
| 48 | #include "qvarlengtharray.h"
|
---|
| 49 | #include "qlayoutengine_p.h"
|
---|
| 50 | #include "qlayout_p.h"
|
---|
| 51 |
|
---|
| 52 | QT_BEGIN_NAMESPACE
|
---|
| 53 |
|
---|
| 54 | struct QGridLayoutSizeTriple
|
---|
| 55 | {
|
---|
| 56 | QSize minS;
|
---|
| 57 | QSize hint;
|
---|
| 58 | QSize maxS;
|
---|
| 59 | };
|
---|
| 60 |
|
---|
| 61 | /*
|
---|
| 62 | Three internal classes related to QGridLayout: (1) QGridBox is a
|
---|
| 63 | QLayoutItem with (row, column) information and (torow, tocolumn) information; (3) QGridLayoutData is
|
---|
| 64 | the internal representation of a QGridLayout.
|
---|
| 65 | */
|
---|
| 66 |
|
---|
| 67 | class QGridBox
|
---|
| 68 | {
|
---|
| 69 | public:
|
---|
| 70 | QGridBox(QLayoutItem *lit) { item_ = lit; }
|
---|
| 71 |
|
---|
| 72 | QGridBox(const QLayout *l, QWidget *wid) { item_ = QLayoutPrivate::createWidgetItem(l, wid); }
|
---|
| 73 | ~QGridBox() { delete item_; }
|
---|
| 74 |
|
---|
| 75 | QSize sizeHint() const { return item_->sizeHint(); }
|
---|
| 76 | QSize minimumSize() const { return item_->minimumSize(); }
|
---|
| 77 | QSize maximumSize() const { return item_->maximumSize(); }
|
---|
| 78 | Qt::Orientations expandingDirections() const { return item_->expandingDirections(); }
|
---|
| 79 | bool isEmpty() const { return item_->isEmpty(); }
|
---|
| 80 |
|
---|
| 81 | bool hasHeightForWidth() const { return item_->hasHeightForWidth(); }
|
---|
| 82 | int heightForWidth(int w) const { return item_->heightForWidth(w); }
|
---|
| 83 |
|
---|
| 84 | void setAlignment(Qt::Alignment a) { item_->setAlignment(a); }
|
---|
| 85 | void setGeometry(const QRect &r) { item_->setGeometry(r); }
|
---|
| 86 | Qt::Alignment alignment() const { return item_->alignment(); }
|
---|
| 87 | QLayoutItem *item() { return item_; }
|
---|
| 88 | QLayoutItem *takeItem() { QLayoutItem *i = item_; item_ = 0; return i; }
|
---|
| 89 |
|
---|
| 90 | int hStretch() { return item_->widget() ?
|
---|
| 91 | item_->widget()->sizePolicy().horizontalStretch() : 0; }
|
---|
| 92 | int vStretch() { return item_->widget() ?
|
---|
| 93 | item_->widget()->sizePolicy().verticalStretch() : 0; }
|
---|
| 94 |
|
---|
| 95 | private:
|
---|
| 96 | friend class QGridLayoutPrivate;
|
---|
| 97 | friend class QGridLayout;
|
---|
| 98 |
|
---|
| 99 | inline int toRow(int rr) const { return torow >= 0 ? torow : rr - 1; }
|
---|
| 100 | inline int toCol(int cc) const { return tocol >= 0 ? tocol : cc - 1; }
|
---|
| 101 |
|
---|
| 102 | QLayoutItem *item_;
|
---|
| 103 | int row, col;
|
---|
| 104 | int torow, tocol;
|
---|
| 105 | };
|
---|
| 106 |
|
---|
| 107 | class QGridLayoutPrivate : public QLayoutPrivate
|
---|
| 108 | {
|
---|
| 109 | Q_DECLARE_PUBLIC(QGridLayout)
|
---|
| 110 | public:
|
---|
| 111 | QGridLayoutPrivate();
|
---|
| 112 |
|
---|
| 113 | void add(QGridBox*, int row, int col);
|
---|
| 114 | void add(QGridBox*, int row1, int row2, int col1, int col2);
|
---|
| 115 | QSize sizeHint(int hSpacing, int vSpacing) const;
|
---|
| 116 | QSize minimumSize(int hSpacing, int vSpacing) const;
|
---|
| 117 | QSize maximumSize(int hSpacing, int vSpacing) const;
|
---|
| 118 |
|
---|
| 119 | Qt::Orientations expandingDirections(int hSpacing, int vSpacing) const;
|
---|
| 120 |
|
---|
| 121 | void distribute(QRect rect, int hSpacing, int vSpacing);
|
---|
| 122 | inline int numRows() const { return rr; }
|
---|
| 123 | inline int numCols() const { return cc; }
|
---|
| 124 | inline void expand(int rows, int cols)
|
---|
| 125 | { setSize(qMax(rows, rr), qMax(cols, cc)); }
|
---|
| 126 | inline void setRowStretch(int r, int s)
|
---|
| 127 | { expand(r + 1, 0); rStretch[r] = s; setDirty(); }
|
---|
| 128 | inline void setColStretch(int c, int s)
|
---|
| 129 | { expand(0, c + 1); cStretch[c] = s; setDirty(); }
|
---|
| 130 | inline int rowStretch(int r) const { return rStretch.at(r); }
|
---|
| 131 | inline int colStretch(int c) const { return cStretch.at(c); }
|
---|
| 132 | inline void setRowMinimumHeight(int r, int s)
|
---|
| 133 | { expand(r + 1, 0); rMinHeights[r] = s; setDirty(); }
|
---|
| 134 | inline void setColumnMinimumWidth(int c, int s)
|
---|
| 135 | { expand(0, c + 1); cMinWidths[c] = s; setDirty(); }
|
---|
| 136 | inline int rowSpacing(int r) const { return rMinHeights.at(r); }
|
---|
| 137 | inline int colSpacing(int c) const { return cMinWidths.at(c); }
|
---|
| 138 |
|
---|
| 139 | inline void setReversed(bool r, bool c) { hReversed = c; vReversed = r; }
|
---|
| 140 | inline bool horReversed() const { return hReversed; }
|
---|
| 141 | inline bool verReversed() const { return vReversed; }
|
---|
| 142 | inline void setDirty() { needRecalc = true; hfw_width = -1; }
|
---|
| 143 | inline bool isDirty() const { return needRecalc; }
|
---|
| 144 | bool hasHeightForWidth(int hSpacing, int vSpacing);
|
---|
| 145 | int heightForWidth(int width, int hSpacing, int vSpacing);
|
---|
| 146 | int minimumHeightForWidth(int width, int hSpacing, int vSpacing);
|
---|
| 147 |
|
---|
| 148 | inline void getNextPos(int &row, int &col) { row = nextR; col = nextC; }
|
---|
| 149 | inline int count() const { return things.count(); }
|
---|
| 150 | QRect cellRect(int row, int col) const;
|
---|
| 151 |
|
---|
| 152 | inline QLayoutItem *itemAt(int index) const {
|
---|
| 153 | if (index < things.count())
|
---|
| 154 | return things.at(index)->item();
|
---|
| 155 | else
|
---|
| 156 | return 0;
|
---|
| 157 | }
|
---|
| 158 | inline QLayoutItem *takeAt(int index) {
|
---|
| 159 | QLayoutItem *item = 0;
|
---|
| 160 | if (index < things.count()) {
|
---|
| 161 | QGridBox *b = things.takeAt(index);
|
---|
| 162 | if (b) {
|
---|
| 163 | item = b->takeItem();
|
---|
| 164 | delete b;
|
---|
| 165 | }
|
---|
| 166 | }
|
---|
| 167 | return item;
|
---|
| 168 | }
|
---|
| 169 |
|
---|
| 170 | void getItemPosition(int index, int *row, int *column, int *rowSpan, int *columnSpan) {
|
---|
| 171 | if (index < things.count()) {
|
---|
| 172 | QGridBox *b = things.at(index);
|
---|
| 173 | int toRow = b->toRow(rr);
|
---|
| 174 | int toCol = b->toCol(cc);
|
---|
| 175 | *row = b->row;
|
---|
| 176 | *column = b->col;
|
---|
| 177 | *rowSpan = toRow - *row + 1;
|
---|
| 178 | *columnSpan = toCol - *column +1;
|
---|
| 179 | }
|
---|
| 180 | }
|
---|
| 181 | void deleteAll();
|
---|
| 182 |
|
---|
| 183 | private:
|
---|
| 184 | void setNextPosAfter(int r, int c);
|
---|
| 185 | void recalcHFW(int w);
|
---|
| 186 | void addHfwData(QGridBox *box, int width);
|
---|
| 187 | void init();
|
---|
| 188 | QSize findSize(int QLayoutStruct::*, int hSpacing, int vSpacing) const;
|
---|
| 189 | void addData(QGridBox *b, const QGridLayoutSizeTriple &sizes, bool r, bool c);
|
---|
| 190 | void setSize(int rows, int cols);
|
---|
| 191 | void setupSpacings(QVector<QLayoutStruct> &chain, QGridBox *grid[], int fixedSpacing,
|
---|
| 192 | Qt::Orientation orientation);
|
---|
| 193 | void setupLayoutData(int hSpacing, int vSpacing);
|
---|
| 194 | void setupHfwLayoutData();
|
---|
| 195 | void effectiveMargins(int *left, int *top, int *right, int *bottom) const;
|
---|
| 196 |
|
---|
| 197 | int rr;
|
---|
| 198 | int cc;
|
---|
| 199 | QVector<QLayoutStruct> rowData;
|
---|
| 200 | QVector<QLayoutStruct> colData;
|
---|
| 201 | QVector<QLayoutStruct> *hfwData;
|
---|
| 202 | QVector<int> rStretch;
|
---|
| 203 | QVector<int> cStretch;
|
---|
| 204 | QVector<int> rMinHeights;
|
---|
| 205 | QVector<int> cMinWidths;
|
---|
| 206 | QList<QGridBox *> things;
|
---|
| 207 |
|
---|
| 208 | int hfw_width;
|
---|
| 209 | int hfw_height;
|
---|
| 210 | int hfw_minheight;
|
---|
| 211 | int nextR;
|
---|
| 212 | int nextC;
|
---|
| 213 |
|
---|
| 214 | int horizontalSpacing;
|
---|
| 215 | int verticalSpacing;
|
---|
| 216 | int leftMargin;
|
---|
| 217 | int topMargin;
|
---|
| 218 | int rightMargin;
|
---|
| 219 | int bottomMargin;
|
---|
| 220 |
|
---|
| 221 | uint hReversed : 1;
|
---|
| 222 | uint vReversed : 1;
|
---|
| 223 | uint needRecalc : 1;
|
---|
| 224 | uint has_hfw : 1;
|
---|
| 225 | uint addVertical : 1;
|
---|
| 226 | };
|
---|
| 227 |
|
---|
| 228 | void QGridLayoutPrivate::effectiveMargins(int *left, int *top, int *right, int *bottom) const
|
---|
| 229 | {
|
---|
| 230 | int l = leftMargin;
|
---|
| 231 | int t = topMargin;
|
---|
| 232 | int r = rightMargin;
|
---|
| 233 | int b = bottomMargin;
|
---|
| 234 | #ifdef Q_WS_MAC
|
---|
| 235 | int leftMost = INT_MAX;
|
---|
| 236 | int topMost = INT_MAX;
|
---|
| 237 | int rightMost = 0;
|
---|
| 238 | int bottomMost = 0;
|
---|
| 239 |
|
---|
| 240 | QWidget *w = 0;
|
---|
| 241 | const int n = things.count();
|
---|
| 242 | for (int i = 0; i < n; ++i) {
|
---|
| 243 | QGridBox *box = things.at(i);
|
---|
| 244 | QLayoutItem *itm = box->item();
|
---|
| 245 | w = itm->widget();
|
---|
| 246 | if (w) {
|
---|
| 247 | bool visualHReversed = hReversed != (w->layoutDirection() == Qt::RightToLeft);
|
---|
| 248 | QRect lir = itm->geometry();
|
---|
| 249 | QRect wr = w->geometry();
|
---|
| 250 | if (box->col <= leftMost) {
|
---|
| 251 | if (box->col < leftMost) {
|
---|
| 252 | // we found an item even closer to the margin, discard.
|
---|
| 253 | leftMost = box->col;
|
---|
| 254 | if (visualHReversed)
|
---|
| 255 | r = rightMargin;
|
---|
| 256 | else
|
---|
| 257 | l = leftMargin;
|
---|
| 258 | }
|
---|
| 259 | if (visualHReversed) {
|
---|
| 260 | r = qMax(r, wr.right() - lir.right());
|
---|
| 261 | } else {
|
---|
| 262 | l = qMax(l, lir.left() - wr.left());
|
---|
| 263 | }
|
---|
| 264 | }
|
---|
| 265 | if (box->row <= topMost) {
|
---|
| 266 | if (box->row < topMost) {
|
---|
| 267 | // we found an item even closer to the margin, discard.
|
---|
| 268 | topMost = box->row;
|
---|
| 269 | if (vReversed)
|
---|
| 270 | b = bottomMargin;
|
---|
| 271 | else
|
---|
| 272 | t = topMargin;
|
---|
| 273 | }
|
---|
| 274 | if (vReversed)
|
---|
| 275 | b = qMax(b, wr.bottom() - lir.bottom());
|
---|
| 276 | else
|
---|
| 277 | t = qMax(t, lir.top() - wr.top());
|
---|
| 278 | }
|
---|
| 279 | if (box->toCol(cc) >= rightMost) {
|
---|
| 280 | if (box->toCol(cc) > rightMost) {
|
---|
| 281 | // we found an item even closer to the margin, discard.
|
---|
| 282 | rightMost = box->toCol(cc);
|
---|
| 283 | if (visualHReversed)
|
---|
| 284 | l = leftMargin;
|
---|
| 285 | else
|
---|
| 286 | r = rightMargin;
|
---|
| 287 | }
|
---|
| 288 | if (visualHReversed) {
|
---|
| 289 | l = qMax(l, lir.left() - wr.left());
|
---|
| 290 | } else {
|
---|
| 291 | r = qMax(r, wr.right() - lir.right());
|
---|
| 292 | }
|
---|
| 293 |
|
---|
| 294 | }
|
---|
| 295 | if (box->toRow(rr) >= bottomMost) {
|
---|
| 296 | if (box->toRow(rr) > bottomMost) {
|
---|
| 297 | // we found an item even closer to the margin, discard.
|
---|
| 298 | bottomMost = box->toRow(rr);
|
---|
| 299 | if (vReversed)
|
---|
| 300 | t = topMargin;
|
---|
| 301 | else
|
---|
| 302 | b = bottomMargin;
|
---|
| 303 | }
|
---|
| 304 | if (vReversed)
|
---|
| 305 | t = qMax(t, lir.top() - wr.top());
|
---|
| 306 | else
|
---|
| 307 | b = qMax(b, wr.bottom() - lir.bottom());
|
---|
| 308 | }
|
---|
| 309 | }
|
---|
| 310 | }
|
---|
| 311 |
|
---|
| 312 | #endif
|
---|
| 313 | if (left)
|
---|
| 314 | *left = l;
|
---|
| 315 | if (top)
|
---|
| 316 | *top = t;
|
---|
| 317 | if (right)
|
---|
| 318 | *right = r;
|
---|
| 319 | if (bottom)
|
---|
| 320 | *bottom = b;
|
---|
| 321 | }
|
---|
| 322 |
|
---|
| 323 | QGridLayoutPrivate::QGridLayoutPrivate()
|
---|
| 324 | {
|
---|
| 325 | addVertical = false;
|
---|
| 326 | setDirty();
|
---|
| 327 | rr = cc = 0;
|
---|
| 328 | nextR = nextC = 0;
|
---|
| 329 | hfwData = 0;
|
---|
| 330 | hReversed = false;
|
---|
| 331 | vReversed = false;
|
---|
| 332 | horizontalSpacing = -1;
|
---|
| 333 | verticalSpacing = -1;
|
---|
| 334 | }
|
---|
| 335 |
|
---|
| 336 | #if 0
|
---|
| 337 | QGridLayoutPrivate::QGridLayoutPrivate(int nRows, int nCols)
|
---|
| 338 | : rowData(0), colData(0)
|
---|
| 339 | {
|
---|
| 340 | init();
|
---|
| 341 | if (nRows < 0) {
|
---|
| 342 | nRows = 1;
|
---|
| 343 | addVertical = false;
|
---|
| 344 | }
|
---|
| 345 | if (nCols < 0) {
|
---|
| 346 | nCols = 1;
|
---|
| 347 | addVertical = true;
|
---|
| 348 | }
|
---|
| 349 | setSize(nRows, nCols);
|
---|
| 350 | }
|
---|
| 351 | #endif
|
---|
| 352 |
|
---|
| 353 | void QGridLayoutPrivate::deleteAll()
|
---|
| 354 | {
|
---|
| 355 | while (!things.isEmpty())
|
---|
| 356 | delete things.takeFirst();
|
---|
| 357 | delete hfwData;
|
---|
| 358 | }
|
---|
| 359 |
|
---|
| 360 | bool QGridLayoutPrivate::hasHeightForWidth(int hSpacing, int vSpacing)
|
---|
| 361 | {
|
---|
| 362 | setupLayoutData(hSpacing, vSpacing);
|
---|
| 363 | return has_hfw;
|
---|
| 364 | }
|
---|
| 365 |
|
---|
| 366 | /*
|
---|
| 367 | Assumes that setupLayoutData() has been called, and that
|
---|
| 368 | qGeomCalc() has filled in colData with appropriate values.
|
---|
| 369 | */
|
---|
| 370 | void QGridLayoutPrivate::recalcHFW(int w)
|
---|
| 371 | {
|
---|
| 372 | /*
|
---|
| 373 | Go through all children, using colData and heightForWidth()
|
---|
| 374 | and put the results in hfwData.
|
---|
| 375 | */
|
---|
| 376 | if (!hfwData)
|
---|
| 377 | hfwData = new QVector<QLayoutStruct>(rr);
|
---|
| 378 | setupHfwLayoutData();
|
---|
| 379 | QVector<QLayoutStruct> &rData = *hfwData;
|
---|
| 380 |
|
---|
| 381 | int h = 0;
|
---|
| 382 | int mh = 0;
|
---|
| 383 | for (int r = 0; r < rr; r++) {
|
---|
| 384 | int spacing = rData.at(r).spacing;
|
---|
| 385 | h += rData.at(r).sizeHint + spacing;
|
---|
| 386 | mh += rData.at(r).minimumSize + spacing;
|
---|
| 387 | }
|
---|
| 388 |
|
---|
| 389 | hfw_width = w;
|
---|
| 390 | hfw_height = qMin(QLAYOUTSIZE_MAX, h);
|
---|
| 391 | hfw_minheight = qMin(QLAYOUTSIZE_MAX, mh);
|
---|
| 392 | }
|
---|
| 393 |
|
---|
| 394 | int QGridLayoutPrivate::heightForWidth(int w, int hSpacing, int vSpacing)
|
---|
| 395 | {
|
---|
| 396 | setupLayoutData(hSpacing, vSpacing);
|
---|
| 397 | if (!has_hfw)
|
---|
| 398 | return -1;
|
---|
| 399 | int left, top, right, bottom;
|
---|
| 400 | effectiveMargins(&left, &top, &right, &bottom);
|
---|
| 401 |
|
---|
| 402 | int hMargins = left + right;
|
---|
| 403 | if (w - hMargins != hfw_width) {
|
---|
| 404 | qGeomCalc(colData, 0, cc, 0, w - hMargins);
|
---|
| 405 | recalcHFW(w - hMargins);
|
---|
| 406 | }
|
---|
| 407 | return hfw_height + top + bottom;
|
---|
| 408 | }
|
---|
| 409 |
|
---|
| 410 | int QGridLayoutPrivate::minimumHeightForWidth(int w, int hSpacing, int vSpacing)
|
---|
| 411 | {
|
---|
| 412 | (void)heightForWidth(w, hSpacing, vSpacing);
|
---|
| 413 | if (!has_hfw)
|
---|
| 414 | return -1;
|
---|
| 415 | int top, bottom;
|
---|
| 416 | effectiveMargins(0, &top, 0, &bottom);
|
---|
| 417 | return hfw_minheight + top + bottom;
|
---|
| 418 | }
|
---|
| 419 |
|
---|
| 420 | QSize QGridLayoutPrivate::findSize(int QLayoutStruct::*size, int hSpacing, int vSpacing) const
|
---|
| 421 | {
|
---|
| 422 | QGridLayoutPrivate *that = const_cast<QGridLayoutPrivate*>(this);
|
---|
| 423 | that->setupLayoutData(hSpacing, vSpacing);
|
---|
| 424 |
|
---|
| 425 | int w = 0;
|
---|
| 426 | int h = 0;
|
---|
| 427 |
|
---|
| 428 | for (int r = 0; r < rr; r++)
|
---|
| 429 | h += rowData.at(r).*size + rowData.at(r).spacing;
|
---|
| 430 | for (int c = 0; c < cc; c++)
|
---|
| 431 | w += colData.at(c).*size + colData.at(c).spacing;
|
---|
| 432 |
|
---|
| 433 | w = qMin(QLAYOUTSIZE_MAX, w);
|
---|
| 434 | h = qMin(QLAYOUTSIZE_MAX, h);
|
---|
| 435 |
|
---|
| 436 | return QSize(w, h);
|
---|
| 437 | }
|
---|
| 438 |
|
---|
| 439 | Qt::Orientations QGridLayoutPrivate::expandingDirections(int hSpacing, int vSpacing) const
|
---|
| 440 | {
|
---|
| 441 | QGridLayoutPrivate *that = const_cast<QGridLayoutPrivate*>(this);
|
---|
| 442 | that->setupLayoutData(hSpacing, vSpacing);
|
---|
| 443 | Qt::Orientations ret;
|
---|
| 444 |
|
---|
| 445 | for (int r = 0; r < rr; r++) {
|
---|
| 446 | if (rowData.at(r).expansive) {
|
---|
| 447 | ret |= Qt::Vertical;
|
---|
| 448 | break;
|
---|
| 449 | }
|
---|
| 450 | }
|
---|
| 451 | for (int c = 0; c < cc; c++) {
|
---|
| 452 | if (colData.at(c).expansive) {
|
---|
| 453 | ret |= Qt::Horizontal;
|
---|
| 454 | break;
|
---|
| 455 | }
|
---|
| 456 | }
|
---|
| 457 | return ret;
|
---|
| 458 | }
|
---|
| 459 |
|
---|
| 460 | QSize QGridLayoutPrivate::sizeHint(int hSpacing, int vSpacing) const
|
---|
| 461 | {
|
---|
| 462 | return findSize(&QLayoutStruct::sizeHint, hSpacing, vSpacing);
|
---|
| 463 | }
|
---|
| 464 |
|
---|
| 465 | QSize QGridLayoutPrivate::maximumSize(int hSpacing, int vSpacing) const
|
---|
| 466 | {
|
---|
| 467 | return findSize(&QLayoutStruct::maximumSize, hSpacing, vSpacing);
|
---|
| 468 | }
|
---|
| 469 |
|
---|
| 470 | QSize QGridLayoutPrivate::minimumSize(int hSpacing, int vSpacing) const
|
---|
| 471 | {
|
---|
| 472 | return findSize(&QLayoutStruct::minimumSize, hSpacing, vSpacing);
|
---|
| 473 | }
|
---|
| 474 |
|
---|
| 475 | void QGridLayoutPrivate::setSize(int r, int c)
|
---|
| 476 | {
|
---|
| 477 | if ((int)rowData.size() < r) {
|
---|
| 478 | int newR = qMax(r, rr * 2);
|
---|
| 479 | rowData.resize(newR);
|
---|
| 480 | rStretch.resize(newR);
|
---|
| 481 | rMinHeights.resize(newR);
|
---|
| 482 | for (int i = rr; i < newR; i++) {
|
---|
| 483 | rowData[i].init();
|
---|
| 484 | rowData[i].maximumSize = 0;
|
---|
| 485 | rowData[i].pos = 0;
|
---|
| 486 | rowData[i].size = 0;
|
---|
| 487 | rStretch[i] = 0;
|
---|
| 488 | rMinHeights[i] = 0;
|
---|
| 489 | }
|
---|
| 490 | }
|
---|
| 491 | if ((int)colData.size() < c) {
|
---|
| 492 | int newC = qMax(c, cc * 2);
|
---|
| 493 | colData.resize(newC);
|
---|
| 494 | cStretch.resize(newC);
|
---|
| 495 | cMinWidths.resize(newC);
|
---|
| 496 | for (int i = cc; i < newC; i++) {
|
---|
| 497 | colData[i].init();
|
---|
| 498 | colData[i].maximumSize = 0;
|
---|
| 499 | colData[i].pos = 0;
|
---|
| 500 | colData[i].size = 0;
|
---|
| 501 | cStretch[i] = 0;
|
---|
| 502 | cMinWidths[i] = 0;
|
---|
| 503 | }
|
---|
| 504 | }
|
---|
| 505 |
|
---|
| 506 | if (hfwData && (int)hfwData->size() < r) {
|
---|
| 507 | delete hfwData;
|
---|
| 508 | hfwData = 0;
|
---|
| 509 | hfw_width = -1;
|
---|
| 510 | }
|
---|
| 511 | rr = r;
|
---|
| 512 | cc = c;
|
---|
| 513 | }
|
---|
| 514 |
|
---|
| 515 | void QGridLayoutPrivate::setNextPosAfter(int row, int col)
|
---|
| 516 | {
|
---|
| 517 | if (addVertical) {
|
---|
| 518 | if (col > nextC || (col == nextC && row >= nextR)) {
|
---|
| 519 | nextR = row + 1;
|
---|
| 520 | nextC = col;
|
---|
| 521 | if (nextR >= rr) {
|
---|
| 522 | nextR = 0;
|
---|
| 523 | nextC++;
|
---|
| 524 | }
|
---|
| 525 | }
|
---|
| 526 | } else {
|
---|
| 527 | if (row > nextR || (row == nextR && col >= nextC)) {
|
---|
| 528 | nextR = row;
|
---|
| 529 | nextC = col + 1;
|
---|
| 530 | if (nextC >= cc) {
|
---|
| 531 | nextC = 0;
|
---|
| 532 | nextR++;
|
---|
| 533 | }
|
---|
| 534 | }
|
---|
| 535 | }
|
---|
| 536 | }
|
---|
| 537 |
|
---|
| 538 | void QGridLayoutPrivate::add(QGridBox *box, int row, int col)
|
---|
| 539 | {
|
---|
| 540 | expand(row + 1, col + 1);
|
---|
| 541 | box->row = box->torow = row;
|
---|
| 542 | box->col = box->tocol = col;
|
---|
| 543 | things.append(box);
|
---|
| 544 | setDirty();
|
---|
| 545 | setNextPosAfter(row, col);
|
---|
| 546 | }
|
---|
| 547 |
|
---|
| 548 | void QGridLayoutPrivate::add(QGridBox *box, int row1, int row2, int col1, int col2)
|
---|
| 549 | {
|
---|
| 550 | if (row2 >= 0 && row2 < row1)
|
---|
| 551 | qWarning("QGridLayout: Multi-cell fromRow greater than toRow");
|
---|
| 552 | if (col2 >= 0 && col2 < col1)
|
---|
| 553 | qWarning("QGridLayout: Multi-cell fromCol greater than toCol");
|
---|
| 554 | if (row1 == row2 && col1 == col2) {
|
---|
| 555 | add(box, row1, col1);
|
---|
| 556 | return;
|
---|
| 557 | }
|
---|
| 558 | expand(row2 + 1, col2 + 1);
|
---|
| 559 | box->row = row1;
|
---|
| 560 | box->col = col1;
|
---|
| 561 |
|
---|
| 562 | box->torow = row2;
|
---|
| 563 | box->tocol = col2;
|
---|
| 564 |
|
---|
| 565 | things.append(box);
|
---|
| 566 | setDirty();
|
---|
| 567 | if (col2 < 0)
|
---|
| 568 | col2 = cc - 1;
|
---|
| 569 |
|
---|
| 570 | setNextPosAfter(row2, col2);
|
---|
| 571 | }
|
---|
| 572 |
|
---|
| 573 | void QGridLayoutPrivate::addData(QGridBox *box, const QGridLayoutSizeTriple &sizes, bool r, bool c)
|
---|
| 574 | {
|
---|
| 575 | const QWidget *widget = box->item()->widget();
|
---|
| 576 |
|
---|
| 577 | if (box->isEmpty() && widget)
|
---|
| 578 | return;
|
---|
| 579 |
|
---|
| 580 | if (c) {
|
---|
| 581 | QLayoutStruct *data = &colData[box->col];
|
---|
| 582 | if (!cStretch.at(box->col))
|
---|
| 583 | data->stretch = qMax(data->stretch, box->hStretch());
|
---|
| 584 | data->sizeHint = qMax(sizes.hint.width(), data->sizeHint);
|
---|
| 585 | data->minimumSize = qMax(sizes.minS.width(), data->minimumSize);
|
---|
| 586 |
|
---|
| 587 | qMaxExpCalc(data->maximumSize, data->expansive, data->empty, sizes.maxS.width(),
|
---|
| 588 | box->expandingDirections() & Qt::Horizontal, box->isEmpty());
|
---|
| 589 | }
|
---|
| 590 | if (r) {
|
---|
| 591 | QLayoutStruct *data = &rowData[box->row];
|
---|
| 592 | if (!rStretch.at(box->row))
|
---|
| 593 | data->stretch = qMax(data->stretch, box->vStretch());
|
---|
| 594 | data->sizeHint = qMax(sizes.hint.height(), data->sizeHint);
|
---|
| 595 | data->minimumSize = qMax(sizes.minS.height(), data->minimumSize);
|
---|
| 596 |
|
---|
| 597 | qMaxExpCalc(data->maximumSize, data->expansive, data->empty, sizes.maxS.height(),
|
---|
| 598 | box->expandingDirections() & Qt::Vertical, box->isEmpty());
|
---|
| 599 | }
|
---|
| 600 | }
|
---|
| 601 |
|
---|
| 602 | static void initEmptyMultiBox(QVector<QLayoutStruct> &chain, int start, int end)
|
---|
| 603 | {
|
---|
| 604 | for (int i = start; i <= end; i++) {
|
---|
| 605 | QLayoutStruct *data = &chain[i];
|
---|
| 606 | if (data->empty && data->maximumSize == 0) // truly empty box
|
---|
| 607 | data->maximumSize = QWIDGETSIZE_MAX;
|
---|
| 608 | data->empty = false;
|
---|
| 609 | }
|
---|
| 610 | }
|
---|
| 611 |
|
---|
| 612 | static void distributeMultiBox(QVector<QLayoutStruct> &chain, int start, int end, int minSize,
|
---|
| 613 | int sizeHint, QVector<int> &stretchArray, int stretch)
|
---|
| 614 | {
|
---|
| 615 | int i;
|
---|
| 616 | int w = 0;
|
---|
| 617 | int wh = 0;
|
---|
| 618 | int max = 0;
|
---|
| 619 |
|
---|
| 620 | for (i = start; i <= end; i++) {
|
---|
| 621 | QLayoutStruct *data = &chain[i];
|
---|
| 622 | w += data->minimumSize;
|
---|
| 623 | wh += data->sizeHint;
|
---|
| 624 | max += data->maximumSize;
|
---|
| 625 | if (stretchArray.at(i) == 0)
|
---|
| 626 | data->stretch = qMax(data->stretch, stretch);
|
---|
| 627 |
|
---|
| 628 | if (i != end) {
|
---|
| 629 | int spacing = data->spacing;
|
---|
| 630 | w += spacing;
|
---|
| 631 | wh += spacing;
|
---|
| 632 | max += spacing;
|
---|
| 633 | }
|
---|
| 634 | }
|
---|
| 635 |
|
---|
| 636 | if (max < minSize) { // implies w < minSize
|
---|
| 637 | /*
|
---|
| 638 | We must increase the maximum size of at least one of the
|
---|
| 639 | items. qGeomCalc() will put the extra space in between the
|
---|
| 640 | items. We must recover that extra space and put it
|
---|
| 641 | somewhere. It does not really matter where, since the user
|
---|
| 642 | can always specify stretch factors and avoid this code.
|
---|
| 643 | */
|
---|
| 644 | qGeomCalc(chain, start, end - start + 1, 0, minSize);
|
---|
| 645 | int pos = 0;
|
---|
| 646 | for (i = start; i <= end; i++) {
|
---|
| 647 | QLayoutStruct *data = &chain[i];
|
---|
| 648 | int nextPos = (i == end) ? minSize : chain.at(i + 1).pos;
|
---|
| 649 | int realSize = nextPos - pos;
|
---|
| 650 | if (i != end)
|
---|
| 651 | realSize -= data->spacing;
|
---|
| 652 | if (data->minimumSize < realSize)
|
---|
| 653 | data->minimumSize = realSize;
|
---|
| 654 | if (data->maximumSize < data->minimumSize)
|
---|
| 655 | data->maximumSize = data->minimumSize;
|
---|
| 656 | pos = nextPos;
|
---|
| 657 | }
|
---|
| 658 | } else if (w < minSize) {
|
---|
| 659 | qGeomCalc(chain, start, end - start + 1, 0, minSize);
|
---|
| 660 | for (i = start; i <= end; i++) {
|
---|
| 661 | QLayoutStruct *data = &chain[i];
|
---|
| 662 | if (data->minimumSize < data->size)
|
---|
| 663 | data->minimumSize = data->size;
|
---|
| 664 | }
|
---|
| 665 | }
|
---|
| 666 |
|
---|
| 667 | if (wh < sizeHint) {
|
---|
| 668 | qGeomCalc(chain, start, end - start + 1, 0, sizeHint);
|
---|
| 669 | for (i = start; i <= end; i++) {
|
---|
| 670 | QLayoutStruct *data = &chain[i];
|
---|
| 671 | if (data->sizeHint < data->size)
|
---|
| 672 | data->sizeHint = data->size;
|
---|
| 673 | }
|
---|
| 674 | }
|
---|
| 675 | }
|
---|
| 676 |
|
---|
| 677 | static QGridBox *&gridAt(QGridBox *grid[], int r, int c, int cc,
|
---|
| 678 | Qt::Orientation orientation = Qt::Vertical)
|
---|
| 679 | {
|
---|
| 680 | if (orientation == Qt::Horizontal)
|
---|
| 681 | qSwap(r, c);
|
---|
| 682 | return grid[(r * cc) + c];
|
---|
| 683 | }
|
---|
| 684 |
|
---|
| 685 | void QGridLayoutPrivate::setupSpacings(QVector<QLayoutStruct> &chain,
|
---|
| 686 | QGridBox *grid[], int fixedSpacing,
|
---|
| 687 | Qt::Orientation orientation)
|
---|
| 688 | {
|
---|
| 689 | Q_Q(QGridLayout);
|
---|
| 690 | int numRows = rr; // or columns if orientation is horizontal
|
---|
| 691 | int numColumns = cc; // or rows if orientation is horizontal
|
---|
| 692 |
|
---|
| 693 | if (orientation == Qt::Horizontal) {
|
---|
| 694 | qSwap(numRows, numColumns);
|
---|
| 695 | }
|
---|
| 696 |
|
---|
| 697 | QStyle *style = 0;
|
---|
| 698 | if (fixedSpacing < 0) {
|
---|
| 699 | if (QWidget *parentWidget = q->parentWidget())
|
---|
| 700 | style = parentWidget->style();
|
---|
| 701 | }
|
---|
| 702 |
|
---|
| 703 | for (int c = 0; c < numColumns; ++c) {
|
---|
| 704 | QGridBox *previousBox = 0;
|
---|
| 705 | int previousRow = -1; // previous *non-empty* row
|
---|
| 706 |
|
---|
| 707 | for (int r = 0; r < numRows; ++r) {
|
---|
| 708 | if (chain.at(r).empty)
|
---|
| 709 | continue;
|
---|
| 710 |
|
---|
| 711 | QGridBox *box = gridAt(grid, r, c, cc, orientation);
|
---|
| 712 | if (previousRow != -1 && (!box || previousBox != box)) {
|
---|
| 713 | int spacing = fixedSpacing;
|
---|
| 714 | if (spacing < 0) {
|
---|
| 715 | QSizePolicy::ControlTypes controlTypes1 = QSizePolicy::DefaultType;
|
---|
| 716 | QSizePolicy::ControlTypes controlTypes2 = QSizePolicy::DefaultType;
|
---|
| 717 | if (previousBox)
|
---|
| 718 | controlTypes1 = previousBox->item()->controlTypes();
|
---|
| 719 | if (box)
|
---|
| 720 | controlTypes2 = box->item()->controlTypes();
|
---|
| 721 |
|
---|
| 722 | if ((orientation == Qt::Horizontal && hReversed)
|
---|
| 723 | || (orientation == Qt::Vertical && vReversed))
|
---|
| 724 | qSwap(controlTypes1, controlTypes2);
|
---|
| 725 |
|
---|
| 726 | if (style)
|
---|
| 727 | spacing = style->combinedLayoutSpacing(controlTypes1, controlTypes2,
|
---|
| 728 | orientation, 0, q->parentWidget());
|
---|
| 729 | } else {
|
---|
| 730 | if (orientation == Qt::Vertical) {
|
---|
| 731 | QGridBox *sibling = vReversed ? previousBox : box;
|
---|
| 732 | if (sibling) {
|
---|
| 733 | QWidget *wid = sibling->item()->widget();
|
---|
| 734 | if (wid)
|
---|
| 735 | spacing = qMax(spacing, sibling->item()->geometry().top() - wid->geometry().top() );
|
---|
| 736 | }
|
---|
| 737 | }
|
---|
| 738 | }
|
---|
| 739 |
|
---|
| 740 | if (spacing > chain.at(previousRow).spacing)
|
---|
| 741 | chain[previousRow].spacing = spacing;
|
---|
| 742 | }
|
---|
| 743 |
|
---|
| 744 | previousBox = box;
|
---|
| 745 | previousRow = r;
|
---|
| 746 | }
|
---|
| 747 | }
|
---|
| 748 | }
|
---|
| 749 |
|
---|
| 750 | //#define QT_LAYOUT_DISABLE_CACHING
|
---|
| 751 |
|
---|
| 752 | void QGridLayoutPrivate::setupLayoutData(int hSpacing, int vSpacing)
|
---|
| 753 | {
|
---|
| 754 | Q_Q(QGridLayout);
|
---|
| 755 |
|
---|
| 756 | #ifndef QT_LAYOUT_DISABLE_CACHING
|
---|
| 757 | if (!needRecalc)
|
---|
| 758 | return;
|
---|
| 759 | #endif
|
---|
| 760 | has_hfw = false;
|
---|
| 761 | int i;
|
---|
| 762 |
|
---|
| 763 | for (i = 0; i < rr; i++) {
|
---|
| 764 | rowData[i].init(rStretch.at(i), rMinHeights.at(i));
|
---|
| 765 | rowData[i].maximumSize = rStretch.at(i) ? QLAYOUTSIZE_MAX : rMinHeights.at(i);
|
---|
| 766 | }
|
---|
| 767 | for (i = 0; i < cc; i++) {
|
---|
| 768 | colData[i].init(cStretch.at(i), cMinWidths.at(i));
|
---|
| 769 | colData[i].maximumSize = cStretch.at(i) ? QLAYOUTSIZE_MAX : cMinWidths.at(i);
|
---|
| 770 | }
|
---|
| 771 |
|
---|
| 772 | int n = things.size();
|
---|
| 773 | QVarLengthArray<QGridLayoutSizeTriple> sizes(n);
|
---|
| 774 |
|
---|
| 775 | bool has_multi = false;
|
---|
| 776 |
|
---|
| 777 | /*
|
---|
| 778 | Grid of items. We use it to determine which items are
|
---|
| 779 | adjacent to which and compute the spacings correctly.
|
---|
| 780 | */
|
---|
| 781 | QVarLengthArray<QGridBox *> grid(rr * cc);
|
---|
| 782 | qMemSet(grid.data(), 0, rr * cc * sizeof(QGridBox *));
|
---|
| 783 |
|
---|
| 784 | /*
|
---|
| 785 | Initialize 'sizes' and 'grid' data structures, and insert
|
---|
| 786 | non-spanning items to our row and column data structures.
|
---|
| 787 | */
|
---|
| 788 | for (i = 0; i < n; ++i) {
|
---|
| 789 | QGridBox * const box = things.at(i);
|
---|
| 790 | sizes[i].minS = box->minimumSize();
|
---|
| 791 | sizes[i].hint = box->sizeHint();
|
---|
| 792 | sizes[i].maxS = box->maximumSize();
|
---|
| 793 |
|
---|
| 794 | if (box->hasHeightForWidth())
|
---|
| 795 | has_hfw = true;
|
---|
| 796 |
|
---|
| 797 | if (box->row == box->toRow(rr)) {
|
---|
| 798 | addData(box, sizes[i], true, false);
|
---|
| 799 | } else {
|
---|
| 800 | initEmptyMultiBox(rowData, box->row, box->toRow(rr));
|
---|
| 801 | has_multi = true;
|
---|
| 802 | }
|
---|
| 803 |
|
---|
| 804 | if (box->col == box->toCol(cc)) {
|
---|
| 805 | addData(box, sizes[i], false, true);
|
---|
| 806 | } else {
|
---|
| 807 | initEmptyMultiBox(colData, box->col, box->toCol(cc));
|
---|
| 808 | has_multi = true;
|
---|
| 809 | }
|
---|
| 810 |
|
---|
| 811 | for (int r = box->row; r <= box->toRow(rr); ++r) {
|
---|
| 812 | for (int c = box->col; c <= box->toCol(cc); ++c) {
|
---|
| 813 | gridAt(grid.data(), r, c, cc) = box;
|
---|
| 814 | }
|
---|
| 815 | }
|
---|
| 816 | }
|
---|
| 817 |
|
---|
| 818 | setupSpacings(colData, grid.data(), hSpacing, Qt::Horizontal);
|
---|
| 819 | setupSpacings(rowData, grid.data(), vSpacing, Qt::Vertical);
|
---|
| 820 |
|
---|
| 821 | /*
|
---|
| 822 | Insert multicell items to our row and column data structures.
|
---|
| 823 | This must be done after the non-spanning items to obtain a
|
---|
| 824 | better distribution in distributeMultiBox().
|
---|
| 825 | */
|
---|
| 826 | if (has_multi) {
|
---|
| 827 | for (i = 0; i < n; ++i) {
|
---|
| 828 | QGridBox * const box = things.at(i);
|
---|
| 829 |
|
---|
| 830 | if (box->row != box->toRow(rr))
|
---|
| 831 | distributeMultiBox(rowData, box->row, box->toRow(rr), sizes[i].minS.height(),
|
---|
| 832 | sizes[i].hint.height(), rStretch, box->vStretch());
|
---|
| 833 | if (box->col != box->toCol(cc))
|
---|
| 834 | distributeMultiBox(colData, box->col, box->toCol(cc), sizes[i].minS.width(),
|
---|
| 835 | sizes[i].hint.width(), cStretch, box->hStretch());
|
---|
| 836 | }
|
---|
| 837 | }
|
---|
| 838 |
|
---|
| 839 | for (i = 0; i < rr; i++)
|
---|
| 840 | rowData[i].expansive = rowData.at(i).expansive || rowData.at(i).stretch > 0;
|
---|
| 841 | for (i = 0; i < cc; i++)
|
---|
| 842 | colData[i].expansive = colData.at(i).expansive || colData.at(i).stretch > 0;
|
---|
| 843 |
|
---|
| 844 | q->getContentsMargins(&leftMargin, &topMargin, &rightMargin, &bottomMargin);
|
---|
| 845 |
|
---|
| 846 | needRecalc = false;
|
---|
| 847 | }
|
---|
| 848 |
|
---|
| 849 | void QGridLayoutPrivate::addHfwData(QGridBox *box, int width)
|
---|
| 850 | {
|
---|
| 851 | QVector<QLayoutStruct> &rData = *hfwData;
|
---|
| 852 | if (box->hasHeightForWidth()) {
|
---|
| 853 | int hint = box->heightForWidth(width);
|
---|
| 854 | rData[box->row].sizeHint = qMax(hint, rData.at(box->row).sizeHint);
|
---|
| 855 | rData[box->row].minimumSize = qMax(hint, rData.at(box->row).minimumSize);
|
---|
| 856 | } else {
|
---|
| 857 | QSize hint = box->sizeHint();
|
---|
| 858 | QSize minS = box->minimumSize();
|
---|
| 859 | rData[box->row].sizeHint = qMax(hint.height(), rData.at(box->row).sizeHint);
|
---|
| 860 | rData[box->row].minimumSize = qMax(minS.height(), rData.at(box->row).minimumSize);
|
---|
| 861 | }
|
---|
| 862 | }
|
---|
| 863 |
|
---|
| 864 | /*
|
---|
| 865 | Similar to setupLayoutData(), but uses heightForWidth(colData)
|
---|
| 866 | instead of sizeHint(). Assumes that setupLayoutData() and
|
---|
| 867 | qGeomCalc(colData) has been called.
|
---|
| 868 | */
|
---|
| 869 | void QGridLayoutPrivate::setupHfwLayoutData()
|
---|
| 870 | {
|
---|
| 871 | QVector<QLayoutStruct> &rData = *hfwData;
|
---|
| 872 | for (int i = 0; i < rr; i++) {
|
---|
| 873 | rData[i] = rowData.at(i);
|
---|
| 874 | rData[i].minimumSize = rData[i].sizeHint = rMinHeights.at(i);
|
---|
| 875 | }
|
---|
| 876 |
|
---|
| 877 | for (int pass = 0; pass < 2; ++pass) {
|
---|
| 878 | for (int i = 0; i < things.size(); ++i) {
|
---|
| 879 | QGridBox *box = things.at(i);
|
---|
| 880 | int r1 = box->row;
|
---|
| 881 | int c1 = box->col;
|
---|
| 882 | int r2 = box->toRow(rr);
|
---|
| 883 | int c2 = box->toCol(cc);
|
---|
| 884 | int w = colData.at(c2).pos + colData.at(c2).size - colData.at(c1).pos;
|
---|
| 885 |
|
---|
| 886 | if (r1 == r2) {
|
---|
| 887 | if (pass == 0)
|
---|
| 888 | addHfwData(box, w);
|
---|
| 889 | } else {
|
---|
| 890 | if (pass == 0) {
|
---|
| 891 | initEmptyMultiBox(rData, r1, r2);
|
---|
| 892 | } else {
|
---|
| 893 | QSize hint = box->sizeHint();
|
---|
| 894 | QSize min = box->minimumSize();
|
---|
| 895 | if (box->hasHeightForWidth()) {
|
---|
| 896 | int hfwh = box->heightForWidth(w);
|
---|
| 897 | if (hfwh > hint.height())
|
---|
| 898 | hint.setHeight(hfwh);
|
---|
| 899 | if (hfwh > min.height())
|
---|
| 900 | min.setHeight(hfwh);
|
---|
| 901 | }
|
---|
| 902 | distributeMultiBox(rData, r1, r2, min.height(), hint.height(),
|
---|
| 903 | rStretch, box->vStretch());
|
---|
| 904 | }
|
---|
| 905 | }
|
---|
| 906 | }
|
---|
| 907 | }
|
---|
| 908 | for (int i = 0; i < rr; i++)
|
---|
| 909 | rData[i].expansive = rData.at(i).expansive || rData.at(i).stretch > 0;
|
---|
| 910 | }
|
---|
| 911 |
|
---|
| 912 | void QGridLayoutPrivate::distribute(QRect r, int hSpacing, int vSpacing)
|
---|
| 913 | {
|
---|
| 914 | Q_Q(QGridLayout);
|
---|
| 915 | bool visualHReversed = hReversed;
|
---|
| 916 | QWidget *parent = q->parentWidget();
|
---|
| 917 | if (parent && parent->isRightToLeft())
|
---|
| 918 | visualHReversed = !visualHReversed;
|
---|
| 919 |
|
---|
| 920 | setupLayoutData(hSpacing, vSpacing);
|
---|
| 921 |
|
---|
| 922 | int left, top, right, bottom;
|
---|
| 923 | effectiveMargins(&left, &top, &right, &bottom);
|
---|
| 924 | r.adjust(+left, +top, -right, -bottom);
|
---|
| 925 |
|
---|
| 926 | qGeomCalc(colData, 0, cc, r.x(), r.width());
|
---|
| 927 | QVector<QLayoutStruct> *rDataPtr;
|
---|
| 928 | if (has_hfw) {
|
---|
| 929 | recalcHFW(r.width());
|
---|
| 930 | qGeomCalc(*hfwData, 0, rr, r.y(), r.height());
|
---|
| 931 | rDataPtr = hfwData;
|
---|
| 932 | } else {
|
---|
| 933 | qGeomCalc(rowData, 0, rr, r.y(), r.height());
|
---|
| 934 | rDataPtr = &rowData;
|
---|
| 935 | }
|
---|
| 936 | QVector<QLayoutStruct> &rData = *rDataPtr;
|
---|
| 937 | int i;
|
---|
| 938 |
|
---|
| 939 | bool reverse = ((r.bottom() > rect.bottom()) || (r.bottom() == rect.bottom()
|
---|
| 940 | && ((r.right() > rect.right()) != visualHReversed)));
|
---|
| 941 | int n = things.size();
|
---|
| 942 | for (i = 0; i < n; ++i) {
|
---|
| 943 | QGridBox *box = things.at(reverse ? n-i-1 : i);
|
---|
| 944 | int r2 = box->toRow(rr);
|
---|
| 945 | int c2 = box->toCol(cc);
|
---|
| 946 |
|
---|
| 947 | int x = colData.at(box->col).pos;
|
---|
| 948 | int y = rData.at(box->row).pos;
|
---|
| 949 | int x2p = colData.at(c2).pos + colData.at(c2).size; // x2+1
|
---|
| 950 | int y2p = rData.at(r2).pos + rData.at(r2).size; // y2+1
|
---|
| 951 | int w = x2p - x;
|
---|
| 952 | int h = y2p - y;
|
---|
| 953 |
|
---|
| 954 | if (visualHReversed)
|
---|
| 955 | x = r.left() + r.right() - x - w + 1;
|
---|
| 956 | if (vReversed)
|
---|
| 957 | y = r.top() + r.bottom() - y - h + 1;
|
---|
| 958 |
|
---|
| 959 | box->setGeometry(QRect(x, y, w, h));
|
---|
| 960 | }
|
---|
| 961 | }
|
---|
| 962 |
|
---|
| 963 | QRect QGridLayoutPrivate::cellRect(int row, int col) const
|
---|
| 964 | {
|
---|
| 965 | if (row < 0 || row >= rr || col < 0 || col >= cc)
|
---|
| 966 | return QRect();
|
---|
| 967 |
|
---|
| 968 | const QVector<QLayoutStruct> *rDataPtr;
|
---|
| 969 | if (has_hfw && hfwData)
|
---|
| 970 | rDataPtr = hfwData;
|
---|
| 971 | else
|
---|
| 972 | rDataPtr = &rowData;
|
---|
| 973 | return QRect(colData.at(col).pos, rDataPtr->at(row).pos,
|
---|
| 974 | colData.at(col).size, rDataPtr->at(row).size);
|
---|
| 975 | }
|
---|
| 976 |
|
---|
| 977 | /*!
|
---|
| 978 | \class QGridLayout
|
---|
| 979 |
|
---|
| 980 | \brief The QGridLayout class lays out widgets in a grid.
|
---|
| 981 |
|
---|
| 982 | \ingroup geomanagement
|
---|
| 983 |
|
---|
[561] | 984 |
|
---|
[2] | 985 | QGridLayout takes the space made available to it (by its parent
|
---|
| 986 | layout or by the parentWidget()), divides it up into rows and
|
---|
| 987 | columns, and puts each widget it manages into the correct cell.
|
---|
| 988 |
|
---|
| 989 | Columns and rows behave identically; we will discuss columns, but
|
---|
| 990 | there are equivalent functions for rows.
|
---|
| 991 |
|
---|
| 992 | Each column has a minimum width and a stretch factor. The minimum
|
---|
| 993 | width is the greatest of that set using setColumnMinimumWidth() and the
|
---|
| 994 | minimum width of each widget in that column. The stretch factor is
|
---|
| 995 | set using setColumnStretch() and determines how much of the available
|
---|
| 996 | space the column will get over and above its necessary minimum.
|
---|
| 997 |
|
---|
| 998 | Normally, each managed widget or layout is put into a cell of its
|
---|
| 999 | own using addWidget(). It is also possible for a widget to occupy
|
---|
| 1000 | multiple cells using the row and column spanning overloads of
|
---|
| 1001 | addItem() and addWidget(). If you do this, QGridLayout will guess
|
---|
| 1002 | how to distribute the size over the columns/rows (based on the
|
---|
| 1003 | stretch factors).
|
---|
| 1004 |
|
---|
| 1005 | To remove a widget from a layout, call removeWidget(). Calling
|
---|
| 1006 | QWidget::hide() on a widget also effectively removes the widget
|
---|
| 1007 | from the layout until QWidget::show() is called.
|
---|
| 1008 |
|
---|
| 1009 | This illustration shows a fragment of a dialog with a five-column,
|
---|
| 1010 | three-row grid (the grid is shown overlaid in magenta):
|
---|
| 1011 |
|
---|
| 1012 | \image gridlayout.png A grid layout
|
---|
| 1013 |
|
---|
| 1014 | Columns 0, 2 and 4 in this dialog fragment are made up of a
|
---|
| 1015 | QLabel, a QLineEdit, and a QListBox. Columns 1 and 3 are
|
---|
| 1016 | placeholders made with setColumnMinimumWidth(). Row 0 consists of three
|
---|
| 1017 | QLabel objects, row 1 of three QLineEdit objects and row 2 of
|
---|
| 1018 | three QListBox objects. We used placeholder columns (1 and 3) to
|
---|
| 1019 | get the right amount of space between the columns.
|
---|
| 1020 |
|
---|
| 1021 | Note that the columns and rows are not equally wide or tall. If
|
---|
| 1022 | you want two columns to have the same width, you must set their
|
---|
| 1023 | minimum widths and stretch factors to be the same yourself. You do
|
---|
| 1024 | this using setColumnMinimumWidth() and setColumnStretch().
|
---|
| 1025 |
|
---|
| 1026 | If the QGridLayout is not the top-level layout (i.e. does not
|
---|
| 1027 | manage all of the widget's area and children), you must add it to
|
---|
| 1028 | its parent layout when you create it, but before you do anything
|
---|
| 1029 | with it. The normal way to add a layout is by calling
|
---|
| 1030 | addLayout() on the parent layout.
|
---|
| 1031 |
|
---|
| 1032 | Once you have added your layout you can start putting widgets and
|
---|
| 1033 | other layouts into the cells of your grid layout using
|
---|
| 1034 | addWidget(), addItem(), and addLayout().
|
---|
| 1035 |
|
---|
[561] | 1036 | QGridLayout also includes two margin widths:
|
---|
| 1037 | the \l{getContentsMargins()}{contents margin} and the spacing().
|
---|
| 1038 | The contents margin is the width of the reserved space along each
|
---|
| 1039 | of the QGridLayout's four sides. The spacing() is the width of the
|
---|
| 1040 | automatically allocated spacing between neighboring boxes.
|
---|
[2] | 1041 |
|
---|
[561] | 1042 | The default contents margin values are provided by the
|
---|
| 1043 | \l{QStyle::pixelMetric()}{style}. The default value Qt styles specify
|
---|
| 1044 | is 9 for child widgets and 11 for windows. The spacing defaults to the same as
|
---|
[2] | 1045 | the margin width for a top-level layout, or to the same as the
|
---|
| 1046 | parent layout.
|
---|
| 1047 |
|
---|
[561] | 1048 | \sa QBoxLayout, QStackedLayout, {Layout Management}, {Basic Layouts Example}
|
---|
[2] | 1049 | */
|
---|
| 1050 |
|
---|
| 1051 |
|
---|
| 1052 | /*!
|
---|
| 1053 | Constructs a new QGridLayout with parent widget, \a parent. The
|
---|
| 1054 | layout has one row and one column initially, and will expand when
|
---|
| 1055 | new items are inserted.
|
---|
| 1056 | */
|
---|
| 1057 | QGridLayout::QGridLayout(QWidget *parent)
|
---|
| 1058 | : QLayout(*new QGridLayoutPrivate, 0, parent)
|
---|
| 1059 | {
|
---|
| 1060 | Q_D(QGridLayout);
|
---|
| 1061 | d->expand(1, 1);
|
---|
| 1062 | }
|
---|
| 1063 |
|
---|
| 1064 | /*!
|
---|
| 1065 | Constructs a new grid layout.
|
---|
| 1066 |
|
---|
| 1067 | You must insert this grid into another layout. You can insert
|
---|
| 1068 | widgets and layouts into this layout at any time, but laying out
|
---|
| 1069 | will not be performed before this is inserted into another layout.
|
---|
| 1070 | */
|
---|
| 1071 | QGridLayout::QGridLayout()
|
---|
| 1072 | : QLayout(*new QGridLayoutPrivate, 0, 0)
|
---|
| 1073 | {
|
---|
| 1074 | Q_D(QGridLayout);
|
---|
| 1075 | d->expand(1, 1);
|
---|
| 1076 | }
|
---|
| 1077 |
|
---|
| 1078 |
|
---|
| 1079 | #ifdef QT3_SUPPORT
|
---|
| 1080 | /*!
|
---|
[561] | 1081 | \obsolete
|
---|
[2] | 1082 | Constructs a new QGridLayout with \a nRows rows, \a nCols columns
|
---|
| 1083 | and parent widget, \a parent. \a parent may not be 0. The grid
|
---|
| 1084 | layout is called \a name.
|
---|
| 1085 |
|
---|
| 1086 | \a margin is the number of pixels between the edge of the widget
|
---|
| 1087 | and its managed children. \a space is the default number of pixels
|
---|
| 1088 | between cells. If \a space is -1, the value of \a margin is used.
|
---|
| 1089 | */
|
---|
| 1090 | QGridLayout::QGridLayout(QWidget *parent, int nRows, int nCols, int margin,
|
---|
| 1091 | int space, const char *name)
|
---|
| 1092 | : QLayout(*new QGridLayoutPrivate, 0, parent)
|
---|
| 1093 | {
|
---|
| 1094 | Q_D(QGridLayout);
|
---|
| 1095 | d->expand(nRows, nCols);
|
---|
| 1096 | setMargin(margin);
|
---|
| 1097 | setSpacing(space < 0 ? margin : space);
|
---|
| 1098 | setObjectName(QString::fromAscii(name));
|
---|
| 1099 | }
|
---|
| 1100 |
|
---|
| 1101 | /*!
|
---|
| 1102 | \obsolete
|
---|
| 1103 |
|
---|
| 1104 | Constructs a new grid with \a nRows rows and \a nCols columns. If
|
---|
| 1105 | \a spacing is -1, this QGridLayout inherits its parent's
|
---|
| 1106 | spacing(); otherwise \a spacing is used. The grid layout is called
|
---|
| 1107 | \a name.
|
---|
| 1108 |
|
---|
| 1109 | You must insert this grid into another layout. You can insert
|
---|
| 1110 | widgets and layouts into this layout at any time, but laying out
|
---|
| 1111 | will not be performed before this is inserted into another layout.
|
---|
| 1112 | */
|
---|
| 1113 | QGridLayout::QGridLayout(QLayout *parentLayout, int nRows, int nCols,
|
---|
| 1114 | int spacing, const char *name)
|
---|
| 1115 | : QLayout(*new QGridLayoutPrivate, parentLayout, 0)
|
---|
| 1116 | {
|
---|
| 1117 | Q_D(QGridLayout);
|
---|
| 1118 | d->expand(nRows, nCols);
|
---|
| 1119 | setSpacing(spacing);
|
---|
| 1120 | setObjectName(QString::fromAscii(name));
|
---|
| 1121 | }
|
---|
| 1122 |
|
---|
| 1123 | /*!
|
---|
| 1124 | \obsolete
|
---|
| 1125 |
|
---|
| 1126 | Constructs a new grid with \a nRows rows and \a nCols columns. If
|
---|
| 1127 | \a spacing is -1, this QGridLayout inherits its parent's
|
---|
| 1128 | spacing(); otherwise \a spacing is used. The grid layout is called
|
---|
| 1129 | \a name.
|
---|
| 1130 |
|
---|
| 1131 | You must insert this grid into another layout. You can insert
|
---|
| 1132 | widgets and layouts into this layout at any time, but laying out
|
---|
| 1133 | will not be performed before this is inserted into another layout.
|
---|
| 1134 | */
|
---|
| 1135 | QGridLayout::QGridLayout(int nRows, int nCols, int spacing, const char *name)
|
---|
| 1136 | : QLayout(*new QGridLayoutPrivate, 0, 0)
|
---|
| 1137 | {
|
---|
| 1138 | Q_D(QGridLayout);
|
---|
| 1139 | d->expand(nRows, nCols);
|
---|
| 1140 | setSpacing(spacing);
|
---|
| 1141 | setObjectName(QString::fromAscii(name));
|
---|
| 1142 | }
|
---|
| 1143 | #endif
|
---|
| 1144 |
|
---|
| 1145 |
|
---|
| 1146 | /*!
|
---|
| 1147 | \internal (mostly)
|
---|
| 1148 |
|
---|
| 1149 | Sets the positioning mode used by addItem(). If \a orient is
|
---|
| 1150 | Qt::Horizontal, this layout is expanded to \a n columns, and items
|
---|
| 1151 | will be added columns-first. Otherwise it is expanded to \a n rows and
|
---|
| 1152 | items will be added rows-first.
|
---|
| 1153 | */
|
---|
| 1154 |
|
---|
| 1155 | void QGridLayout::setDefaultPositioning(int n, Qt::Orientation orient)
|
---|
| 1156 | {
|
---|
| 1157 | Q_D(QGridLayout);
|
---|
| 1158 | if (orient == Qt::Horizontal) {
|
---|
| 1159 | d->expand(1, n);
|
---|
| 1160 | d->addVertical = false;
|
---|
| 1161 | } else {
|
---|
| 1162 | d->expand(n,1);
|
---|
| 1163 | d->addVertical = true;
|
---|
| 1164 | }
|
---|
| 1165 | }
|
---|
| 1166 |
|
---|
| 1167 |
|
---|
| 1168 | /*!
|
---|
| 1169 | Destroys the grid layout. Geometry management is terminated if
|
---|
| 1170 | this is a top-level grid.
|
---|
| 1171 |
|
---|
| 1172 | The layout's widgets aren't destroyed.
|
---|
| 1173 | */
|
---|
| 1174 | QGridLayout::~QGridLayout()
|
---|
| 1175 | {
|
---|
| 1176 | Q_D(QGridLayout);
|
---|
| 1177 | d->deleteAll();
|
---|
| 1178 | }
|
---|
| 1179 |
|
---|
| 1180 | /*!
|
---|
| 1181 | \property QGridLayout::horizontalSpacing
|
---|
| 1182 | \brief the spacing between widgets that are laid out side by side
|
---|
| 1183 | \since 4.3
|
---|
| 1184 |
|
---|
| 1185 | If no value is explicitly set, the layout's horizontal spacing is
|
---|
| 1186 | inherited from the parent layout, or from the style settings for
|
---|
| 1187 | the parent widget.
|
---|
| 1188 |
|
---|
| 1189 | \sa verticalSpacing, QStyle::pixelMetric(), {QStyle::}{PM_LayoutHorizontalSpacing}
|
---|
| 1190 | */
|
---|
| 1191 | void QGridLayout::setHorizontalSpacing(int spacing)
|
---|
| 1192 | {
|
---|
| 1193 | Q_D(QGridLayout);
|
---|
| 1194 | d->horizontalSpacing = spacing;
|
---|
| 1195 | invalidate();
|
---|
| 1196 | }
|
---|
| 1197 |
|
---|
| 1198 | int QGridLayout::horizontalSpacing() const
|
---|
| 1199 | {
|
---|
| 1200 | Q_D(const QGridLayout);
|
---|
| 1201 | if (d->horizontalSpacing >= 0) {
|
---|
| 1202 | return d->horizontalSpacing;
|
---|
| 1203 | } else {
|
---|
| 1204 | return qSmartSpacing(this, QStyle::PM_LayoutHorizontalSpacing);
|
---|
| 1205 | }
|
---|
| 1206 | }
|
---|
| 1207 |
|
---|
| 1208 | /*!
|
---|
| 1209 | \property QGridLayout::verticalSpacing
|
---|
| 1210 | \brief the spacing between widgets that are laid out on top of each other
|
---|
| 1211 | \since 4.3
|
---|
| 1212 |
|
---|
| 1213 | If no value is explicitly set, the layout's vertical spacing is
|
---|
| 1214 | inherited from the parent layout, or from the style settings for
|
---|
| 1215 | the parent widget.
|
---|
| 1216 |
|
---|
| 1217 | \sa horizontalSpacing, QStyle::pixelMetric(), {QStyle::}{PM_LayoutHorizontalSpacing}
|
---|
| 1218 | */
|
---|
| 1219 | void QGridLayout::setVerticalSpacing(int spacing)
|
---|
| 1220 | {
|
---|
| 1221 | Q_D(QGridLayout);
|
---|
| 1222 | d->verticalSpacing = spacing;
|
---|
| 1223 | invalidate();
|
---|
| 1224 | }
|
---|
| 1225 |
|
---|
| 1226 | int QGridLayout::verticalSpacing() const
|
---|
| 1227 | {
|
---|
| 1228 | Q_D(const QGridLayout);
|
---|
| 1229 | if (d->verticalSpacing >= 0) {
|
---|
| 1230 | return d->verticalSpacing;
|
---|
| 1231 | } else {
|
---|
| 1232 | return qSmartSpacing(this, QStyle::PM_LayoutVerticalSpacing);
|
---|
| 1233 | }
|
---|
| 1234 | }
|
---|
| 1235 |
|
---|
| 1236 | /*!
|
---|
| 1237 | This function sets both the vertical and horizontal spacing to
|
---|
| 1238 | \a spacing.
|
---|
| 1239 |
|
---|
| 1240 | \sa setVerticalSpacing(), setHorizontalSpacing()
|
---|
| 1241 | */
|
---|
| 1242 | void QGridLayout::setSpacing(int spacing)
|
---|
| 1243 | {
|
---|
| 1244 | Q_D(QGridLayout);
|
---|
| 1245 | d->horizontalSpacing = d->verticalSpacing = spacing;
|
---|
| 1246 | invalidate();
|
---|
| 1247 | }
|
---|
| 1248 |
|
---|
| 1249 | /*!
|
---|
| 1250 | If the vertical spacing is equal to the horizontal spacing,
|
---|
| 1251 | this function returns that value; otherwise it return -1.
|
---|
| 1252 |
|
---|
| 1253 | \sa setSpacing(), verticalSpacing(), horizontalSpacing()
|
---|
| 1254 | */
|
---|
| 1255 | int QGridLayout::spacing() const
|
---|
| 1256 | {
|
---|
| 1257 | int hSpacing = horizontalSpacing();
|
---|
| 1258 | if (hSpacing == verticalSpacing()) {
|
---|
| 1259 | return hSpacing;
|
---|
| 1260 | } else {
|
---|
| 1261 | return -1;
|
---|
| 1262 | }
|
---|
| 1263 | }
|
---|
| 1264 |
|
---|
| 1265 | /*!
|
---|
| 1266 | Returns the number of rows in this grid.
|
---|
| 1267 | */
|
---|
| 1268 | int QGridLayout::rowCount() const
|
---|
| 1269 | {
|
---|
| 1270 | Q_D(const QGridLayout);
|
---|
| 1271 | return d->numRows();
|
---|
| 1272 | }
|
---|
| 1273 |
|
---|
| 1274 | /*!
|
---|
| 1275 | Returns the number of columns in this grid.
|
---|
| 1276 | */
|
---|
| 1277 | int QGridLayout::columnCount() const
|
---|
| 1278 | {
|
---|
| 1279 | Q_D(const QGridLayout);
|
---|
| 1280 | return d->numCols();
|
---|
| 1281 | }
|
---|
| 1282 |
|
---|
| 1283 | /*!
|
---|
| 1284 | \reimp
|
---|
| 1285 | */
|
---|
| 1286 | QSize QGridLayout::sizeHint() const
|
---|
| 1287 | {
|
---|
| 1288 | Q_D(const QGridLayout);
|
---|
| 1289 | QSize result(d->sizeHint(horizontalSpacing(), verticalSpacing()));
|
---|
| 1290 | int left, top, right, bottom;
|
---|
| 1291 | d->effectiveMargins(&left, &top, &right, &bottom);
|
---|
| 1292 | result += QSize(left + right, top + bottom);
|
---|
| 1293 | return result;
|
---|
| 1294 | }
|
---|
| 1295 |
|
---|
| 1296 | /*!
|
---|
| 1297 | \reimp
|
---|
| 1298 | */
|
---|
| 1299 | QSize QGridLayout::minimumSize() const
|
---|
| 1300 | {
|
---|
| 1301 | Q_D(const QGridLayout);
|
---|
| 1302 | QSize result(d->minimumSize(horizontalSpacing(), verticalSpacing()));
|
---|
| 1303 | int left, top, right, bottom;
|
---|
| 1304 | d->effectiveMargins(&left, &top, &right, &bottom);
|
---|
| 1305 | result += QSize(left + right, top + bottom);
|
---|
| 1306 | return result;
|
---|
| 1307 | }
|
---|
| 1308 |
|
---|
| 1309 | /*!
|
---|
| 1310 | \reimp
|
---|
| 1311 | */
|
---|
| 1312 | QSize QGridLayout::maximumSize() const
|
---|
| 1313 | {
|
---|
| 1314 | Q_D(const QGridLayout);
|
---|
| 1315 |
|
---|
| 1316 | QSize s = d->maximumSize(horizontalSpacing(), verticalSpacing());
|
---|
| 1317 | int left, top, right, bottom;
|
---|
| 1318 | d->effectiveMargins(&left, &top, &right, &bottom);
|
---|
| 1319 | s += QSize(left + right, top + bottom);
|
---|
| 1320 | s = s.boundedTo(QSize(QLAYOUTSIZE_MAX, QLAYOUTSIZE_MAX));
|
---|
| 1321 | if (alignment() & Qt::AlignHorizontal_Mask)
|
---|
| 1322 | s.setWidth(QLAYOUTSIZE_MAX);
|
---|
| 1323 | if (alignment() & Qt::AlignVertical_Mask)
|
---|
| 1324 | s.setHeight(QLAYOUTSIZE_MAX);
|
---|
| 1325 | return s;
|
---|
| 1326 | }
|
---|
| 1327 |
|
---|
| 1328 | /*!
|
---|
| 1329 | \reimp
|
---|
| 1330 | */
|
---|
| 1331 | bool QGridLayout::hasHeightForWidth() const
|
---|
| 1332 | {
|
---|
| 1333 | return ((QGridLayout*)this)->d_func()->hasHeightForWidth(horizontalSpacing(), verticalSpacing());
|
---|
| 1334 | }
|
---|
| 1335 |
|
---|
| 1336 | /*!
|
---|
| 1337 | \reimp
|
---|
| 1338 | */
|
---|
| 1339 | int QGridLayout::heightForWidth(int w) const
|
---|
| 1340 | {
|
---|
| 1341 | Q_D(const QGridLayout);
|
---|
| 1342 | QGridLayoutPrivate *dat = const_cast<QGridLayoutPrivate *>(d);
|
---|
| 1343 | return dat->heightForWidth(w, horizontalSpacing(), verticalSpacing());
|
---|
| 1344 | }
|
---|
| 1345 |
|
---|
| 1346 | /*!
|
---|
| 1347 | \reimp
|
---|
| 1348 | */
|
---|
| 1349 | int QGridLayout::minimumHeightForWidth(int w) const
|
---|
| 1350 | {
|
---|
| 1351 | Q_D(const QGridLayout);
|
---|
| 1352 | QGridLayoutPrivate *dat = const_cast<QGridLayoutPrivate *>(d);
|
---|
| 1353 | return dat->minimumHeightForWidth(w, horizontalSpacing(), verticalSpacing());
|
---|
| 1354 | }
|
---|
| 1355 |
|
---|
| 1356 | #ifdef QT3_SUPPORT
|
---|
| 1357 | /*!
|
---|
| 1358 | \compat
|
---|
| 1359 |
|
---|
| 1360 | Searches for widget \a w in this layout (not including child
|
---|
| 1361 | layouts). If \a w is found, it sets \c{*}\a{row} and
|
---|
| 1362 | \c{*}\a{column} to the row and column that the widget
|
---|
| 1363 | occupies and returns true; otherwise returns false.
|
---|
| 1364 |
|
---|
| 1365 | If the widget spans multiple rows/columns, the top-left cell
|
---|
| 1366 | is returned.
|
---|
| 1367 |
|
---|
| 1368 | Use indexOf() and getItemPosition() instead.
|
---|
| 1369 | */
|
---|
| 1370 | bool QGridLayout::findWidget(QWidget* w, int *row, int *column)
|
---|
| 1371 | {
|
---|
| 1372 | Q_D(QGridLayout);
|
---|
| 1373 | int index = indexOf(w);
|
---|
| 1374 | if (index < 0)
|
---|
| 1375 | return false;
|
---|
| 1376 | int dummy1, dummy2;
|
---|
| 1377 | d->getItemPosition(index, row, column, &dummy1, &dummy2);
|
---|
| 1378 | return true;
|
---|
| 1379 | }
|
---|
| 1380 | #endif
|
---|
| 1381 | /*!
|
---|
| 1382 | \reimp
|
---|
| 1383 | */
|
---|
| 1384 | int QGridLayout::count() const
|
---|
| 1385 | {
|
---|
| 1386 | Q_D(const QGridLayout);
|
---|
| 1387 | return d->count();
|
---|
| 1388 | }
|
---|
| 1389 |
|
---|
| 1390 |
|
---|
| 1391 | /*!
|
---|
| 1392 | \reimp
|
---|
| 1393 | */
|
---|
| 1394 | QLayoutItem *QGridLayout::itemAt(int index) const
|
---|
| 1395 | {
|
---|
| 1396 | Q_D(const QGridLayout);
|
---|
| 1397 | return d->itemAt(index);
|
---|
| 1398 | }
|
---|
| 1399 |
|
---|
| 1400 | /*!
|
---|
| 1401 | \since 4.4
|
---|
| 1402 |
|
---|
| 1403 | Returns the layout item that occupies cell (\a row, \a column), or 0 if
|
---|
| 1404 | the cell is empty.
|
---|
| 1405 |
|
---|
| 1406 | \sa getItemPosition(), indexOf()
|
---|
| 1407 | */
|
---|
| 1408 | QLayoutItem *QGridLayout::itemAtPosition(int row, int column) const
|
---|
| 1409 | {
|
---|
| 1410 | Q_D(const QGridLayout);
|
---|
| 1411 | int n = d->things.count();
|
---|
| 1412 | for (int i = 0; i < n; ++i) {
|
---|
| 1413 | QGridBox *box = d->things.at(i);
|
---|
| 1414 | if (row >= box->row && row <= box->toRow(d->rr)
|
---|
| 1415 | && column >= box->col && column <= box->toCol(d->cc)) {
|
---|
| 1416 | return box->item();
|
---|
| 1417 | }
|
---|
| 1418 | }
|
---|
| 1419 | return 0;
|
---|
| 1420 | }
|
---|
| 1421 |
|
---|
| 1422 | /*!
|
---|
| 1423 | \reimp
|
---|
| 1424 | */
|
---|
| 1425 | QLayoutItem *QGridLayout::takeAt(int index)
|
---|
| 1426 | {
|
---|
| 1427 | Q_D(QGridLayout);
|
---|
| 1428 | return d->takeAt(index);
|
---|
| 1429 | }
|
---|
| 1430 |
|
---|
| 1431 | /*!
|
---|
| 1432 | Returns the position information of the item with the given \a index.
|
---|
| 1433 |
|
---|
| 1434 | The variables passed as \a row and \a column are updated with the position of the
|
---|
| 1435 | item in the layout, and the \a rowSpan and \a columnSpan variables are updated
|
---|
| 1436 | with the vertical and horizontal spans of the item.
|
---|
| 1437 |
|
---|
| 1438 | \sa itemAtPosition(), itemAt()
|
---|
| 1439 | */
|
---|
| 1440 | void QGridLayout::getItemPosition(int index, int *row, int *column, int *rowSpan, int *columnSpan)
|
---|
| 1441 | {
|
---|
| 1442 | Q_D(QGridLayout);
|
---|
| 1443 | d->getItemPosition(index, row, column, rowSpan, columnSpan);
|
---|
| 1444 | }
|
---|
| 1445 |
|
---|
| 1446 |
|
---|
| 1447 | /*!
|
---|
| 1448 | \reimp
|
---|
| 1449 | */
|
---|
| 1450 | void QGridLayout::setGeometry(const QRect &rect)
|
---|
| 1451 | {
|
---|
| 1452 | Q_D(QGridLayout);
|
---|
| 1453 | if (d->isDirty() || rect != geometry()) {
|
---|
| 1454 | QRect cr = alignment() ? alignmentRect(rect) : rect;
|
---|
| 1455 | d->distribute(cr, horizontalSpacing(), verticalSpacing());
|
---|
| 1456 | QLayout::setGeometry(rect);
|
---|
| 1457 | }
|
---|
| 1458 | }
|
---|
| 1459 |
|
---|
| 1460 | /*!
|
---|
| 1461 | Returns the geometry of the cell with row \a row and column \a column
|
---|
| 1462 | in the grid. Returns an invalid rectangle if \a row or \a column is
|
---|
| 1463 | outside the grid.
|
---|
| 1464 |
|
---|
| 1465 | \warning in the current version of Qt this function does not
|
---|
| 1466 | return valid results until setGeometry() has been called, i.e.
|
---|
| 1467 | after the parentWidget() is visible.
|
---|
| 1468 | */
|
---|
| 1469 | QRect QGridLayout::cellRect(int row, int column) const
|
---|
| 1470 | {
|
---|
| 1471 | Q_D(const QGridLayout);
|
---|
| 1472 | return d->cellRect(row, column);
|
---|
| 1473 | }
|
---|
| 1474 | #ifdef QT3_SUPPORT
|
---|
| 1475 | /*!
|
---|
| 1476 | \obsolete
|
---|
| 1477 | Expands this grid so that it will have \a nRows rows and \a nCols
|
---|
| 1478 | columns. Will not shrink the grid. You should not need to call
|
---|
| 1479 | this function because QGridLayout expands automatically as new
|
---|
| 1480 | items are inserted.
|
---|
| 1481 | */
|
---|
| 1482 | void QGridLayout::expand(int nRows, int nCols)
|
---|
| 1483 | {
|
---|
| 1484 | Q_D(QGridLayout);
|
---|
| 1485 | d->expand(nRows, nCols);
|
---|
| 1486 | }
|
---|
| 1487 | #endif
|
---|
| 1488 |
|
---|
| 1489 | /*!
|
---|
| 1490 | \reimp
|
---|
| 1491 | */
|
---|
| 1492 | void QGridLayout::addItem(QLayoutItem *item)
|
---|
| 1493 | {
|
---|
| 1494 | Q_D(QGridLayout);
|
---|
| 1495 | int r, c;
|
---|
| 1496 | d->getNextPos(r, c);
|
---|
| 1497 | addItem(item, r, c);
|
---|
| 1498 | }
|
---|
| 1499 |
|
---|
| 1500 | /*!
|
---|
| 1501 | Adds \a item at position \a row, \a column, spanning \a rowSpan
|
---|
| 1502 | rows and \a columnSpan columns, and aligns it according to \a
|
---|
| 1503 | alignment. If \a rowSpan and/or \a columnSpan is -1, then the item
|
---|
| 1504 | will extend to the bottom and/or right edge, respectively. The
|
---|
| 1505 | layout takes ownership of the \a item.
|
---|
| 1506 |
|
---|
| 1507 | \warning Do not use this function to add child layouts or child
|
---|
| 1508 | widget items. Use addLayout() or addWidget() instead.
|
---|
| 1509 | */
|
---|
| 1510 | void QGridLayout::addItem(QLayoutItem *item, int row, int column, int rowSpan, int columnSpan, Qt::Alignment alignment)
|
---|
| 1511 | {
|
---|
| 1512 | Q_D(QGridLayout);
|
---|
| 1513 | QGridBox *b = new QGridBox(item);
|
---|
| 1514 | b->setAlignment(alignment);
|
---|
| 1515 | d->add(b, row, (rowSpan < 0) ? -1 : row + rowSpan - 1, column, (columnSpan < 0) ? -1 : column + columnSpan - 1);
|
---|
| 1516 | invalidate();
|
---|
| 1517 | }
|
---|
| 1518 |
|
---|
| 1519 | /*
|
---|
| 1520 | Returns true if the widget \a w can be added to the layout \a l;
|
---|
| 1521 | otherwise returns false.
|
---|
| 1522 | */
|
---|
| 1523 | static bool checkWidget(QLayout *l, QWidget *w)
|
---|
| 1524 | {
|
---|
| 1525 | if (!w) {
|
---|
| 1526 | qWarning("QLayout: Cannot add null widget to %s/%s", l->metaObject()->className(),
|
---|
| 1527 | l->objectName().toLocal8Bit().data());
|
---|
| 1528 | return false;
|
---|
| 1529 | }
|
---|
| 1530 | return true;
|
---|
| 1531 | }
|
---|
| 1532 |
|
---|
| 1533 | /*!
|
---|
| 1534 | Adds the given \a widget to the cell grid at \a row, \a column. The
|
---|
| 1535 | top-left position is (0, 0) by default.
|
---|
| 1536 |
|
---|
| 1537 | The alignment is specified by \a alignment. The default
|
---|
| 1538 | alignment is 0, which means that the widget fills the entire cell.
|
---|
| 1539 |
|
---|
| 1540 | */
|
---|
| 1541 | void QGridLayout::addWidget(QWidget *widget, int row, int column, Qt::Alignment alignment)
|
---|
| 1542 | {
|
---|
| 1543 | if (!checkWidget(this, widget))
|
---|
| 1544 | return;
|
---|
| 1545 | if (row < 0 || column < 0) {
|
---|
| 1546 | qWarning("QGridLayout: Cannot add %s/%s to %s/%s at row %d column %d",
|
---|
| 1547 | widget->metaObject()->className(), widget->objectName().toLocal8Bit().data(),
|
---|
| 1548 | metaObject()->className(), objectName().toLocal8Bit().data(), row, column);
|
---|
| 1549 | return;
|
---|
| 1550 | }
|
---|
| 1551 | addChildWidget(widget);
|
---|
| 1552 | QWidgetItem *b = QLayoutPrivate::createWidgetItem(this, widget);
|
---|
| 1553 | addItem(b, row, column, 1, 1, alignment);
|
---|
| 1554 | }
|
---|
| 1555 |
|
---|
| 1556 | /*!
|
---|
| 1557 | \overload
|
---|
| 1558 |
|
---|
| 1559 | This version adds the given \a widget to the cell grid, spanning
|
---|
| 1560 | multiple rows/columns. The cell will start at \a fromRow, \a
|
---|
| 1561 | fromColumn spanning \a rowSpan rows and \a columnSpan columns. The
|
---|
| 1562 | \a widget will have the given \a alignment.
|
---|
| 1563 |
|
---|
| 1564 | If \a rowSpan and/or \a columnSpan is -1, then the widget will
|
---|
| 1565 | extend to the bottom and/or right edge, respectively.
|
---|
| 1566 |
|
---|
| 1567 | */
|
---|
| 1568 | void QGridLayout::addWidget(QWidget *widget, int fromRow, int fromColumn,
|
---|
| 1569 | int rowSpan, int columnSpan, Qt::Alignment alignment)
|
---|
| 1570 | {
|
---|
| 1571 | Q_D(QGridLayout);
|
---|
| 1572 | if (!checkWidget(this, widget))
|
---|
| 1573 | return;
|
---|
| 1574 | int toRow = (rowSpan < 0) ? -1 : fromRow + rowSpan - 1;
|
---|
| 1575 | int toColumn = (columnSpan < 0) ? -1 : fromColumn + columnSpan - 1;
|
---|
| 1576 | addChildWidget(widget);
|
---|
| 1577 | QGridBox *b = new QGridBox(this, widget);
|
---|
| 1578 | b->setAlignment(alignment);
|
---|
| 1579 | d->add(b, fromRow, toRow, fromColumn, toColumn);
|
---|
| 1580 | invalidate();
|
---|
| 1581 | }
|
---|
| 1582 |
|
---|
| 1583 | /*!
|
---|
| 1584 | \fn void QGridLayout::addWidget(QWidget *widget)
|
---|
| 1585 |
|
---|
| 1586 | \overload
|
---|
| 1587 | \internal
|
---|
| 1588 | */
|
---|
| 1589 |
|
---|
| 1590 | /*!
|
---|
| 1591 | Places the \a layout at position (\a row, \a column) in the grid. The
|
---|
| 1592 | top-left position is (0, 0).
|
---|
| 1593 |
|
---|
| 1594 | The alignment is specified by \a alignment. The default
|
---|
| 1595 | alignment is 0, which means that the widget fills the entire cell.
|
---|
| 1596 |
|
---|
| 1597 | A non-zero alignment indicates that the layout should not grow to
|
---|
| 1598 | fill the available space but should be sized according to
|
---|
| 1599 | sizeHint().
|
---|
| 1600 |
|
---|
| 1601 |
|
---|
| 1602 | \a layout becomes a child of the grid layout.
|
---|
| 1603 | */
|
---|
| 1604 | void QGridLayout::addLayout(QLayout *layout, int row, int column, Qt::Alignment alignment)
|
---|
| 1605 | {
|
---|
| 1606 | Q_D(QGridLayout);
|
---|
| 1607 | addChildLayout(layout);
|
---|
| 1608 | QGridBox *b = new QGridBox(layout);
|
---|
| 1609 | b->setAlignment(alignment);
|
---|
| 1610 | d->add(b, row, column);
|
---|
| 1611 | }
|
---|
| 1612 |
|
---|
| 1613 | /*!
|
---|
| 1614 | \overload
|
---|
| 1615 | This version adds the layout \a layout to the cell grid, spanning multiple
|
---|
| 1616 | rows/columns. The cell will start at \a row, \a column spanning \a
|
---|
| 1617 | rowSpan rows and \a columnSpan columns.
|
---|
| 1618 |
|
---|
| 1619 | If \a rowSpan and/or \a columnSpan is -1, then the layout will extend to the bottom
|
---|
| 1620 | and/or right edge, respectively.
|
---|
| 1621 | */
|
---|
| 1622 | void QGridLayout::addLayout(QLayout *layout, int row, int column,
|
---|
| 1623 | int rowSpan, int columnSpan, Qt::Alignment alignment)
|
---|
| 1624 | {
|
---|
| 1625 | Q_D(QGridLayout);
|
---|
| 1626 | addChildLayout(layout);
|
---|
| 1627 | QGridBox *b = new QGridBox(layout);
|
---|
| 1628 | b->setAlignment(alignment);
|
---|
| 1629 | d->add(b, row, (rowSpan < 0) ? -1 : row + rowSpan - 1, column, (columnSpan < 0) ? -1 : column + columnSpan - 1);
|
---|
| 1630 | }
|
---|
| 1631 |
|
---|
| 1632 | /*!
|
---|
| 1633 | Sets the stretch factor of row \a row to \a stretch. The first row
|
---|
| 1634 | is number 0.
|
---|
| 1635 |
|
---|
| 1636 | The stretch factor is relative to the other rows in this grid.
|
---|
| 1637 | Rows with a higher stretch factor take more of the available
|
---|
| 1638 | space.
|
---|
| 1639 |
|
---|
| 1640 | The default stretch factor is 0. If the stretch factor is 0 and no
|
---|
| 1641 | other row in this table can grow at all, the row may still grow.
|
---|
| 1642 |
|
---|
| 1643 | \sa rowStretch(), setRowMinimumHeight(), setColumnStretch()
|
---|
| 1644 | */
|
---|
| 1645 | void QGridLayout::setRowStretch(int row, int stretch)
|
---|
| 1646 | {
|
---|
| 1647 | Q_D(QGridLayout);
|
---|
| 1648 | d->setRowStretch(row, stretch);
|
---|
| 1649 | invalidate();
|
---|
| 1650 | }
|
---|
| 1651 |
|
---|
| 1652 | /*!
|
---|
| 1653 | Returns the stretch factor for row \a row.
|
---|
| 1654 |
|
---|
| 1655 | \sa setRowStretch()
|
---|
| 1656 | */
|
---|
| 1657 | int QGridLayout::rowStretch(int row) const
|
---|
| 1658 | {
|
---|
| 1659 | Q_D(const QGridLayout);
|
---|
| 1660 | return d->rowStretch(row);
|
---|
| 1661 | }
|
---|
| 1662 |
|
---|
| 1663 | /*!
|
---|
| 1664 | Returns the stretch factor for column \a column.
|
---|
| 1665 |
|
---|
| 1666 | \sa setColumnStretch()
|
---|
| 1667 | */
|
---|
| 1668 | int QGridLayout::columnStretch(int column) const
|
---|
| 1669 | {
|
---|
| 1670 | Q_D(const QGridLayout);
|
---|
| 1671 | return d->colStretch(column);
|
---|
| 1672 | }
|
---|
| 1673 |
|
---|
| 1674 | /*!
|
---|
| 1675 | Sets the stretch factor of column \a column to \a stretch. The first
|
---|
| 1676 | column is number 0.
|
---|
| 1677 |
|
---|
| 1678 | The stretch factor is relative to the other columns in this grid.
|
---|
| 1679 | Columns with a higher stretch factor take more of the available
|
---|
| 1680 | space.
|
---|
| 1681 |
|
---|
| 1682 | The default stretch factor is 0. If the stretch factor is 0 and no
|
---|
| 1683 | other column in this table can grow at all, the column may still
|
---|
| 1684 | grow.
|
---|
| 1685 |
|
---|
| 1686 | An alternative approach is to add spacing using addItem() with a
|
---|
| 1687 | QSpacerItem.
|
---|
| 1688 |
|
---|
| 1689 | \sa columnStretch(), setRowStretch()
|
---|
| 1690 | */
|
---|
| 1691 | void QGridLayout::setColumnStretch(int column, int stretch)
|
---|
| 1692 | {
|
---|
| 1693 | Q_D(QGridLayout);
|
---|
| 1694 | d->setColStretch(column, stretch);
|
---|
| 1695 | invalidate();
|
---|
| 1696 | }
|
---|
| 1697 |
|
---|
| 1698 |
|
---|
| 1699 |
|
---|
| 1700 | /*!
|
---|
| 1701 | Sets the minimum height of row \a row to \a minSize pixels.
|
---|
| 1702 |
|
---|
| 1703 | \sa rowMinimumHeight(), setColumnMinimumWidth()
|
---|
| 1704 | */
|
---|
| 1705 | void QGridLayout::setRowMinimumHeight(int row, int minSize)
|
---|
| 1706 | {
|
---|
| 1707 | Q_D(QGridLayout);
|
---|
| 1708 | d->setRowMinimumHeight(row, minSize);
|
---|
| 1709 | invalidate();
|
---|
| 1710 | }
|
---|
| 1711 |
|
---|
| 1712 | /*!
|
---|
| 1713 | Returns the minimum width set for row \a row.
|
---|
| 1714 |
|
---|
| 1715 | \sa setRowMinimumHeight()
|
---|
| 1716 | */
|
---|
| 1717 | int QGridLayout::rowMinimumHeight(int row) const
|
---|
| 1718 | {
|
---|
| 1719 | Q_D(const QGridLayout);
|
---|
| 1720 | return d->rowSpacing(row);
|
---|
| 1721 | }
|
---|
| 1722 |
|
---|
| 1723 | /*!
|
---|
| 1724 | Sets the minimum width of column \a column to \a minSize pixels.
|
---|
| 1725 |
|
---|
| 1726 | \sa columnMinimumWidth(), setRowMinimumHeight()
|
---|
| 1727 | */
|
---|
| 1728 | void QGridLayout::setColumnMinimumWidth(int column, int minSize)
|
---|
| 1729 | {
|
---|
| 1730 | Q_D(QGridLayout);
|
---|
| 1731 | d->setColumnMinimumWidth(column, minSize);
|
---|
| 1732 | invalidate();
|
---|
| 1733 | }
|
---|
| 1734 |
|
---|
| 1735 | /*!
|
---|
| 1736 | Returns the column spacing for column \a column.
|
---|
| 1737 |
|
---|
| 1738 | \sa setColumnMinimumWidth()
|
---|
| 1739 | */
|
---|
| 1740 | int QGridLayout::columnMinimumWidth(int column) const
|
---|
| 1741 | {
|
---|
| 1742 | Q_D(const QGridLayout);
|
---|
| 1743 | return d->colSpacing(column);
|
---|
| 1744 | }
|
---|
| 1745 |
|
---|
| 1746 | /*!
|
---|
| 1747 | \reimp
|
---|
| 1748 | */
|
---|
| 1749 | Qt::Orientations QGridLayout::expandingDirections() const
|
---|
| 1750 | {
|
---|
| 1751 | Q_D(const QGridLayout);
|
---|
| 1752 | return d->expandingDirections(horizontalSpacing(), verticalSpacing());
|
---|
| 1753 | }
|
---|
| 1754 |
|
---|
| 1755 | /*!
|
---|
| 1756 | Sets the grid's origin corner, i.e. position (0, 0), to \a corner.
|
---|
| 1757 | */
|
---|
| 1758 | void QGridLayout::setOriginCorner(Qt::Corner corner)
|
---|
| 1759 | {
|
---|
| 1760 | Q_D(QGridLayout);
|
---|
| 1761 | d->setReversed(corner == Qt::BottomLeftCorner || corner == Qt::BottomRightCorner,
|
---|
| 1762 | corner == Qt::TopRightCorner || corner == Qt::BottomRightCorner);
|
---|
| 1763 | }
|
---|
| 1764 |
|
---|
| 1765 | /*!
|
---|
| 1766 | Returns the corner that's used for the grid's origin, i.e. for
|
---|
| 1767 | position (0, 0).
|
---|
| 1768 | */
|
---|
| 1769 | Qt::Corner QGridLayout::originCorner() const
|
---|
| 1770 | {
|
---|
| 1771 | Q_D(const QGridLayout);
|
---|
| 1772 | if (d->horReversed()) {
|
---|
| 1773 | return d->verReversed() ? Qt::BottomRightCorner : Qt::TopRightCorner;
|
---|
| 1774 | } else {
|
---|
| 1775 | return d->verReversed() ? Qt::BottomLeftCorner : Qt::TopLeftCorner;
|
---|
| 1776 | }
|
---|
| 1777 | }
|
---|
| 1778 |
|
---|
| 1779 | /*!
|
---|
| 1780 | \reimp
|
---|
| 1781 | */
|
---|
| 1782 | void QGridLayout::invalidate()
|
---|
| 1783 | {
|
---|
| 1784 | Q_D(QGridLayout);
|
---|
| 1785 | d->setDirty();
|
---|
| 1786 | QLayout::invalidate();
|
---|
| 1787 | }
|
---|
| 1788 |
|
---|
| 1789 | /*!
|
---|
| 1790 | \fn void QGridLayout::addRowSpacing(int row, int minsize)
|
---|
| 1791 |
|
---|
| 1792 | Use addItem(new QSpacerItem(0, minsize), row, 0) instead.
|
---|
| 1793 | */
|
---|
| 1794 |
|
---|
| 1795 | /*!
|
---|
| 1796 | \fn void QGridLayout::addColSpacing(int col, int minsize)
|
---|
| 1797 |
|
---|
| 1798 | Use addItem(new QSpacerItem(minsize, 0), 0, col) instead.
|
---|
| 1799 | */
|
---|
| 1800 |
|
---|
| 1801 | /*!
|
---|
| 1802 | \fn void QGridLayout::addMultiCellWidget(QWidget *widget, int fromRow, int toRow, int fromCol, int toCol, Qt::Alignment align = 0)
|
---|
| 1803 |
|
---|
| 1804 | Use an addWidget() overload that allows you to specify row and
|
---|
| 1805 | column spans instead.
|
---|
| 1806 | */
|
---|
| 1807 |
|
---|
| 1808 | /*!
|
---|
| 1809 | \fn void QGridLayout::addMultiCell(QLayoutItem *l, int fromRow, int toRow, int fromCol, int toCol, Qt::Alignment align = 0)
|
---|
| 1810 |
|
---|
| 1811 | Use an addItem() overload that allows you to specify row and
|
---|
| 1812 | column spans instead.
|
---|
| 1813 | */
|
---|
| 1814 |
|
---|
| 1815 | /*!
|
---|
| 1816 | \fn void QGridLayout::addMultiCellLayout(QLayout *layout, int fromRow, int toRow, int fromCol, int toCol, Qt::Alignment align = 0)
|
---|
| 1817 |
|
---|
| 1818 | Use an addLayout() overload that allows you to specify row and
|
---|
| 1819 | column spans instead.
|
---|
| 1820 | */
|
---|
| 1821 |
|
---|
| 1822 | /*!
|
---|
| 1823 | \fn int QGridLayout::numRows() const
|
---|
| 1824 |
|
---|
| 1825 | Use rowCount() instead.
|
---|
| 1826 | */
|
---|
| 1827 |
|
---|
| 1828 | /*!
|
---|
| 1829 | \fn int QGridLayout::numCols() const
|
---|
| 1830 |
|
---|
| 1831 | Use columnCount() instead.
|
---|
| 1832 | */
|
---|
| 1833 |
|
---|
| 1834 | /*!
|
---|
| 1835 | \fn void QGridLayout::setColStretch(int col, int stretch)
|
---|
| 1836 |
|
---|
| 1837 | Use setColumnStretch() instead.
|
---|
| 1838 | */
|
---|
| 1839 |
|
---|
| 1840 | /*!
|
---|
| 1841 | \fn int QGridLayout::colStretch(int col) const
|
---|
| 1842 |
|
---|
| 1843 | Use columnStretch() instead.
|
---|
| 1844 | */
|
---|
| 1845 |
|
---|
| 1846 | /*!
|
---|
| 1847 | \fn void QGridLayout::setColSpacing(int col, int minSize)
|
---|
| 1848 |
|
---|
| 1849 | Use setColumnMinimumWidth() instead.
|
---|
| 1850 | */
|
---|
| 1851 |
|
---|
| 1852 | /*!
|
---|
| 1853 | \fn int QGridLayout::colSpacing(int col) const
|
---|
| 1854 |
|
---|
[769] | 1855 | Use columnMinimumWidth() instead.
|
---|
[2] | 1856 | */
|
---|
| 1857 |
|
---|
| 1858 | /*!
|
---|
| 1859 | \fn void QGridLayout::setRowSpacing(int row, int minSize)
|
---|
| 1860 |
|
---|
| 1861 | Use setRowMinimumHeight(\a row, \a minSize) instead.
|
---|
| 1862 | */
|
---|
| 1863 |
|
---|
| 1864 | /*!
|
---|
| 1865 | \fn int QGridLayout::rowSpacing(int row) const
|
---|
| 1866 |
|
---|
| 1867 | Use rowMinimumHeight(\a row) instead.
|
---|
| 1868 | */
|
---|
| 1869 |
|
---|
| 1870 | /*!
|
---|
| 1871 | \fn QRect QGridLayout::cellGeometry(int row, int column) const
|
---|
| 1872 |
|
---|
| 1873 | Use cellRect(\a row, \a column) instead.
|
---|
| 1874 | */
|
---|
| 1875 |
|
---|
| 1876 | /*!
|
---|
| 1877 | \fn void QGridLayout::setOrigin(Qt::Corner corner)
|
---|
| 1878 |
|
---|
| 1879 | Use setOriginCorner(\a corner) instead.
|
---|
| 1880 | */
|
---|
| 1881 |
|
---|
| 1882 | /*!
|
---|
| 1883 | \fn Qt::Corner QGridLayout::origin() const
|
---|
| 1884 |
|
---|
| 1885 | Use originCorner() instead.
|
---|
| 1886 | */
|
---|
| 1887 |
|
---|
| 1888 |
|
---|
| 1889 | QT_END_NAMESPACE
|
---|