18 return rect.adjusted(priv->leftLayoutItemMargin, priv->topLayoutItemMargin,
19 -priv->rightLayoutItemMargin, -priv->bottomLayoutItemMargin);
24 return fromLayoutItemRect(priv, QRect(QPoint(0, 0), size)).size();
29 return rect.adjusted(-priv->leftLayoutItemMargin, -priv->topLayoutItemMargin,
30 priv->rightLayoutItemMargin, priv->bottomLayoutItemMargin);
35 return toLayoutItemRect(priv, QRect(QPoint(0, 0), size)).size();
39
40
41
42
43
44
45
46
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
131
132
133
134
135
138
139
140
141
144
145
146
147
148
149
150
151void QLayoutItem::setAlignment(Qt::Alignment alignment)
157
158
159
160
163
164
165
166
169
170
171
172
175
176
177
178
179
180
181
184
185
186
187
188
189
192
193
194
195
196
197
200
201
202
203
204
207
208
209
210
211
212
213
214
215
218
219
220QSpacerItem::~QSpacerItem() {}
223
224
225
226
227
228
229
230
231
232
233
234
235
236void QSpacerItem::changeSize(
int w,
int h, QSizePolicy::Policy hPolicy,
237 QSizePolicy::Policy vPolicy)
241 sizeP = QSizePolicy(hPolicy, vPolicy);
245
246
247
248
251
252
253QWidgetItem::~QWidgetItem() =
default;
256
257
258QLayoutItem::~QLayoutItem() =
default;
261
262
263void QLayoutItem::invalidate()
268
269
270
271
272
273QLayout *QLayoutItem::layout()
279
280
281
282
283
284QSpacerItem *QLayoutItem::spacerItem()
290
291
292QLayout * QLayout::layout()
298
299
300QSpacerItem * QSpacerItem::spacerItem()
306
307
308
309
310
313
314
315
316
317
318
319
320
321
322QWidget *QLayoutItem::widget()
const
328
329
330QWidget *QWidgetItem::widget()
const
336
337
338
339
340
341
342
343
344
345bool QLayoutItem::hasHeightForWidth()
const
351
352
353
354
355int QLayoutItem::minimumHeightForWidth(
int w)
const
357 return heightForWidth(w);
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379int QLayoutItem::heightForWidth(
int )
const
385
386
387
388
389
390
391
392QSizePolicy::ControlTypes QLayoutItem::controlTypes()
const
394 return QSizePolicy::DefaultType;
398
399
400void QSpacerItem::setGeometry(
const QRect &r)
406
407
408void QWidgetItem::setGeometry(
const QRect &rect)
413 QRect r = !wid->testAttribute(Qt::WA_LayoutUsesWidgetRect)
414 ? fromLayoutItemRect(wid->d_func(), rect)
416 const QSize widgetRectSurplus = r.size() - rect.size();
419
420
421
422
423
424
425
426
427
429 QSize s = r.size().boundedTo(maximumSize() + widgetRectSurplus);
432 if (align & (Qt::AlignHorizontal_Mask | Qt::AlignVertical_Mask)) {
433 QSize pref(sizeHint());
434 QSizePolicy sp = wid->sizePolicy();
435 if (sp.horizontalPolicy() == QSizePolicy::Ignored)
436 pref.setWidth(wid->sizeHint().expandedTo(wid->minimumSize()).width());
437 if (sp.verticalPolicy() == QSizePolicy::Ignored)
438 pref.setHeight(wid->sizeHint().expandedTo(wid->minimumSize()).height());
439 pref += widgetRectSurplus;
440 if (align & Qt::AlignHorizontal_Mask)
441 s.setWidth(qMin(s.width(), pref.width()));
442 if (align & Qt::AlignVertical_Mask) {
443 if (hasHeightForWidth())
444 s.setHeight(qMin(s.height(),
445 heightForWidth(s.width() - widgetRectSurplus.width())
446 + widgetRectSurplus.height()));
448 s.setHeight(qMin(s.height(), pref.height()));
451 Qt::Alignment alignHoriz = QStyle::visualAlignment(wid->layoutDirection(), align);
452 if (alignHoriz & Qt::AlignRight)
453 x = x + (r.width() - s.width());
454 else if (!(alignHoriz & Qt::AlignLeft))
455 x = x + (r.width() - s.width()) / 2;
457 if (align & Qt::AlignBottom)
458 y = y + (r.height() - s.height());
459 else if (!(align & Qt::AlignTop))
460 y = y + (r.height() - s.height()) / 2;
473 wid->setGeometry(x, y, s.width(), s.height());
477
478
479QRect QSpacerItem::geometry()
const
485
486
487QRect QWidgetItem::geometry()
const
489 return !wid->testAttribute(Qt::WA_LayoutUsesWidgetRect)
490 ? toLayoutItemRect(wid->d_func(), wid->geometry())
496
497
498bool QWidgetItem::hasHeightForWidth()
const
502 return wid->hasHeightForWidth();
506
507
508int QWidgetItem::heightForWidth(
int w)
const
513 w = !wid->testAttribute(Qt::WA_LayoutUsesWidgetRect)
514 ? fromLayoutItemSize(wid->d_func(), QSize(w, 0)).width()
519 hfw = wid->layout()->totalHeightForWidth(w);
521 hfw = wid->heightForWidth(w);
523 if (hfw > wid->maximumHeight())
524 hfw = wid->maximumHeight();
525 if (hfw < wid->minimumHeight())
526 hfw = wid->minimumHeight();
528 hfw = !wid->testAttribute(Qt::WA_LayoutUsesWidgetRect)
529 ? toLayoutItemSize(wid->d_func(), QSize(0, hfw)).height()
537int QWidgetItem::minimumHeightForWidth(
int w)
const
542 w = !wid->testAttribute(Qt::WA_LayoutUsesWidgetRect)
543 ? fromLayoutItemSize(wid->d_func(), QSize(w, 0)).width()
548 hfw = wid->layout()->totalMinimumHeightForWidth(w);
550 hfw = wid->heightForWidth(w);
552 if (hfw > wid->maximumHeight())
553 hfw = wid->maximumHeight();
554 if (hfw < wid->minimumHeight())
555 hfw = wid->minimumHeight();
557 hfw = !wid->testAttribute(Qt::WA_LayoutUsesWidgetRect)
558 ? toLayoutItemSize(wid->d_func(), QSize(0, hfw)).height()
568
569
570Qt::Orientations QSpacerItem::expandingDirections()
const
572 return sizeP.expandingDirections();
576
577
578Qt::Orientations QWidgetItem::expandingDirections()
const
583 Qt::Orientations e = wid->sizePolicy().expandingDirections();
585
586
587
589 if (wid->sizePolicy().horizontalPolicy() & QSizePolicy::GrowFlag
590 && (wid->layout()->expandingDirections() & Qt::Horizontal))
592 if (wid->sizePolicy().verticalPolicy() & QSizePolicy::GrowFlag
593 && (wid->layout()->expandingDirections() & Qt::Vertical))
597 if (align & Qt::AlignHorizontal_Mask)
598 e &= ~Qt::Horizontal;
599 if (align & Qt::AlignVertical_Mask)
605
606
607QSize QSpacerItem::minimumSize()
const
609 return QSize(sizeP.horizontalPolicy() & QSizePolicy::ShrinkFlag ? 0 : width,
610 sizeP.verticalPolicy() & QSizePolicy::ShrinkFlag ? 0 : height);
614
615
616QSize QWidgetItem::minimumSize()
const
620 return !wid->testAttribute(Qt::WA_LayoutUsesWidgetRect)
621 ? toLayoutItemSize(wid->d_func(), qSmartMinSize(
this))
622 : qSmartMinSize(
this);
626
627
628QSize QSpacerItem::maximumSize()
const
630 return QSize(sizeP.horizontalPolicy() & QSizePolicy::GrowFlag ? QLAYOUTSIZE_MAX : width,
631 sizeP.verticalPolicy() & QSizePolicy::GrowFlag ? QLAYOUTSIZE_MAX : height);
635
636
637QSize QWidgetItem::maximumSize()
const
642 return !wid->testAttribute(Qt::WA_LayoutUsesWidgetRect)
643 ? toLayoutItemSize(wid->d_func(), qSmartMaxSize(
this, align))
644 : qSmartMaxSize(
this, align);
649
650
651QSize QSpacerItem::sizeHint()
const
653 return QSize(width, height);
657
658
659QSize QWidgetItem::sizeHint()
const
663 s = wid->sizeHint().expandedTo(wid->minimumSizeHint());
664 s = s.boundedTo(wid->maximumSize())
665 .expandedTo(wid->minimumSize());
666 s = !wid->testAttribute(Qt::WA_LayoutUsesWidgetRect)
667 ? toLayoutItemSize(wid->d_func(), s)
670 if (wid->sizePolicy().horizontalPolicy() == QSizePolicy::Ignored)
672 if (wid->sizePolicy().verticalPolicy() == QSizePolicy::Ignored)
679
680
681bool QSpacerItem::isEmpty()
const
687
688
689
690
691bool QWidgetItem::isEmpty()
const
693 return (wid->isHidden() && !wid->sizePolicy().retainSizeWhenHidden()) || wid->isWindow();
697
698
699
700
701
702QSizePolicy::ControlTypes QWidgetItem::controlTypes()
const
704 return wid->sizePolicy().controlType();
708
709
710
712inline bool QWidgetItemV2::useSizeCache()
const
714 return wid->d_func()->widgetItem ==
this;
717void QWidgetItemV2::updateCacheIfNecessary()
const
719 if (q_cachedMinimumSize.width() != Dirty)
722 const QSize sizeHint(wid->sizeHint());
723 const QSize minimumSizeHint(wid->minimumSizeHint());
724 const QSize minimumSize(wid->minimumSize());
725 const QSize maximumSize(wid->maximumSize());
726 const QSizePolicy sizePolicy(wid->sizePolicy());
727 const QSize expandedSizeHint(sizeHint.expandedTo(minimumSizeHint));
729 const QSize smartMinSize(qSmartMinSize(sizeHint, minimumSizeHint, minimumSize, maximumSize, sizePolicy));
730 const QSize smartMaxSize(qSmartMaxSize(expandedSizeHint, minimumSize, maximumSize, sizePolicy, align));
732 const bool useLayoutItemRect = !wid->testAttribute(Qt::WA_LayoutUsesWidgetRect);
734 q_cachedMinimumSize = useLayoutItemRect
735 ? toLayoutItemSize(wid->d_func(), smartMinSize)
738 q_cachedSizeHint = expandedSizeHint;
739 q_cachedSizeHint = q_cachedSizeHint.boundedTo(maximumSize)
740 .expandedTo(minimumSize);
741 q_cachedSizeHint = useLayoutItemRect
742 ? toLayoutItemSize(wid->d_func(), q_cachedSizeHint)
745 if (wid->sizePolicy().horizontalPolicy() == QSizePolicy::Ignored)
746 q_cachedSizeHint.setWidth(0);
747 if (wid->sizePolicy().verticalPolicy() == QSizePolicy::Ignored)
748 q_cachedSizeHint.setHeight(0);
750 q_cachedMaximumSize = useLayoutItemRect
751 ? toLayoutItemSize(wid->d_func(), smartMaxSize)
755QWidgetItemV2::QWidgetItemV2(QWidget *widget)
756 : QWidgetItem(widget),
757 q_cachedMinimumSize(Dirty, Dirty),
758 q_cachedSizeHint(Dirty, Dirty),
759 q_cachedMaximumSize(Dirty, Dirty),
764 QWidgetPrivate *wd = wid->d_func();
766 wd->widgetItem =
this;
769QWidgetItemV2::~QWidgetItemV2()
772 auto *wd =
static_cast<QWidgetPrivate *>(QObjectPrivate::get(wid));
773 if (wd->widgetItem ==
this)
774 wd->widgetItem =
nullptr;
778QSize QWidgetItemV2::sizeHint()
const
783 if (useSizeCache()) {
784 updateCacheIfNecessary();
785 return q_cachedSizeHint;
787 return QWidgetItem::sizeHint();
791QSize QWidgetItemV2::minimumSize()
const
796 if (useSizeCache()) {
797 updateCacheIfNecessary();
798 return q_cachedMinimumSize;
800 return QWidgetItem::minimumSize();
804QSize QWidgetItemV2::maximumSize()
const
809 if (useSizeCache()) {
810 updateCacheIfNecessary();
811 return q_cachedMaximumSize;
813 return QWidgetItem::maximumSize();
818
819
820
821
822
823
824
825
826
827
828
829
830
832int QWidgetItemV2::heightForWidth(
int width)
const
837 for (
int i = 0; i < q_hfwCacheSize; ++i) {
838 int offset = q_firstCachedHfw + i;
839 const QSize &size = q_cachedHfws[offset % HfwCacheMaxSize];
840 if (size.width() == width) {
841 if (q_hfwCacheSize == HfwCacheMaxSize)
842 q_firstCachedHfw = offset % HfwCacheMaxSize;
843 return size.height();
847 if (q_hfwCacheSize < HfwCacheMaxSize)
849 q_firstCachedHfw = (q_firstCachedHfw + HfwCacheMaxSize - 1) % HfwCacheMaxSize;
851 int height = QWidgetItem::heightForWidth(width);
852 q_cachedHfws[q_firstCachedHfw] = QSize(width, height);
static QSize toLayoutItemSize(QWidgetPrivate *priv, const QSize &size)
static QT_BEGIN_NAMESPACE QRect fromLayoutItemRect(QWidgetPrivate *priv, const QRect &rect)
static QRect toLayoutItemRect(QWidgetPrivate *priv, const QRect &rect)
static QSize fromLayoutItemSize(QWidgetPrivate *priv, const QSize &size)