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;
462 wid->setGeometry(x, y, s.width(), s.height());
466
467
468QRect QSpacerItem::geometry()
const
474
475
476QRect QWidgetItem::geometry()
const
478 return !wid->testAttribute(Qt::WA_LayoutUsesWidgetRect)
479 ? toLayoutItemRect(wid->d_func(), wid->geometry())
485
486
487bool QWidgetItem::hasHeightForWidth()
const
491 return wid->hasHeightForWidth();
495
496
497int QWidgetItem::heightForWidth(
int w)
const
502 w = !wid->testAttribute(Qt::WA_LayoutUsesWidgetRect)
503 ? fromLayoutItemSize(wid->d_func(), QSize(w, 0)).width()
508 hfw = wid->layout()->totalHeightForWidth(w);
510 hfw = wid->heightForWidth(w);
512 if (hfw > wid->maximumHeight())
513 hfw = wid->maximumHeight();
514 if (hfw < wid->minimumHeight())
515 hfw = wid->minimumHeight();
517 hfw = !wid->testAttribute(Qt::WA_LayoutUsesWidgetRect)
518 ? toLayoutItemSize(wid->d_func(), QSize(0, hfw)).height()
526int QWidgetItem::minimumHeightForWidth(
int w)
const
531 w = !wid->testAttribute(Qt::WA_LayoutUsesWidgetRect)
532 ? fromLayoutItemSize(wid->d_func(), QSize(w, 0)).width()
537 hfw = wid->layout()->totalMinimumHeightForWidth(w);
539 hfw = wid->heightForWidth(w);
541 if (hfw > wid->maximumHeight())
542 hfw = wid->maximumHeight();
543 if (hfw < wid->minimumHeight())
544 hfw = wid->minimumHeight();
546 hfw = !wid->testAttribute(Qt::WA_LayoutUsesWidgetRect)
547 ? toLayoutItemSize(wid->d_func(), QSize(0, hfw)).height()
557
558
559Qt::Orientations QSpacerItem::expandingDirections()
const
561 return sizeP.expandingDirections();
565
566
567Qt::Orientations QWidgetItem::expandingDirections()
const
572 Qt::Orientations e = wid->sizePolicy().expandingDirections();
574
575
576
578 if (wid->sizePolicy().horizontalPolicy() & QSizePolicy::GrowFlag
579 && (wid->layout()->expandingDirections() & Qt::Horizontal))
581 if (wid->sizePolicy().verticalPolicy() & QSizePolicy::GrowFlag
582 && (wid->layout()->expandingDirections() & Qt::Vertical))
586 if (align & Qt::AlignHorizontal_Mask)
587 e &= ~Qt::Horizontal;
588 if (align & Qt::AlignVertical_Mask)
594
595
596QSize QSpacerItem::minimumSize()
const
598 return QSize(sizeP.horizontalPolicy() & QSizePolicy::ShrinkFlag ? 0 : width,
599 sizeP.verticalPolicy() & QSizePolicy::ShrinkFlag ? 0 : height);
603
604
605QSize QWidgetItem::minimumSize()
const
609 return !wid->testAttribute(Qt::WA_LayoutUsesWidgetRect)
610 ? toLayoutItemSize(wid->d_func(), qSmartMinSize(
this))
611 : qSmartMinSize(
this);
615
616
617QSize QSpacerItem::maximumSize()
const
619 return QSize(sizeP.horizontalPolicy() & QSizePolicy::GrowFlag ? QLAYOUTSIZE_MAX : width,
620 sizeP.verticalPolicy() & QSizePolicy::GrowFlag ? QLAYOUTSIZE_MAX : height);
624
625
626QSize QWidgetItem::maximumSize()
const
631 return !wid->testAttribute(Qt::WA_LayoutUsesWidgetRect)
632 ? toLayoutItemSize(wid->d_func(), qSmartMaxSize(
this, align))
633 : qSmartMaxSize(
this, align);
638
639
640QSize QSpacerItem::sizeHint()
const
642 return QSize(width, height);
646
647
648QSize QWidgetItem::sizeHint()
const
652 s = wid->sizeHint().expandedTo(wid->minimumSizeHint());
653 s = s.boundedTo(wid->maximumSize())
654 .expandedTo(wid->minimumSize());
655 s = !wid->testAttribute(Qt::WA_LayoutUsesWidgetRect)
656 ? toLayoutItemSize(wid->d_func(), s)
659 if (wid->sizePolicy().horizontalPolicy() == QSizePolicy::Ignored)
661 if (wid->sizePolicy().verticalPolicy() == QSizePolicy::Ignored)
668
669
670bool QSpacerItem::isEmpty()
const
676
677
678
679
680bool QWidgetItem::isEmpty()
const
682 return (wid->isHidden() && !wid->sizePolicy().retainSizeWhenHidden()) || wid->isWindow();
686
687
688
689
690
691QSizePolicy::ControlTypes QWidgetItem::controlTypes()
const
693 return wid->sizePolicy().controlType();
697
698
699
701inline bool QWidgetItemV2::useSizeCache()
const
703 return wid->d_func()->widgetItem ==
this;
706void QWidgetItemV2::updateCacheIfNecessary()
const
708 if (q_cachedMinimumSize.width() != Dirty)
711 const QSize sizeHint(wid->sizeHint());
712 const QSize minimumSizeHint(wid->minimumSizeHint());
713 const QSize minimumSize(wid->minimumSize());
714 const QSize maximumSize(wid->maximumSize());
715 const QSizePolicy sizePolicy(wid->sizePolicy());
716 const QSize expandedSizeHint(sizeHint.expandedTo(minimumSizeHint));
718 const QSize smartMinSize(qSmartMinSize(sizeHint, minimumSizeHint, minimumSize, maximumSize, sizePolicy));
719 const QSize smartMaxSize(qSmartMaxSize(expandedSizeHint, minimumSize, maximumSize, sizePolicy, align));
721 const bool useLayoutItemRect = !wid->testAttribute(Qt::WA_LayoutUsesWidgetRect);
723 q_cachedMinimumSize = useLayoutItemRect
724 ? toLayoutItemSize(wid->d_func(), smartMinSize)
727 q_cachedSizeHint = expandedSizeHint;
728 q_cachedSizeHint = q_cachedSizeHint.boundedTo(maximumSize)
729 .expandedTo(minimumSize);
730 q_cachedSizeHint = useLayoutItemRect
731 ? toLayoutItemSize(wid->d_func(), q_cachedSizeHint)
734 if (wid->sizePolicy().horizontalPolicy() == QSizePolicy::Ignored)
735 q_cachedSizeHint.setWidth(0);
736 if (wid->sizePolicy().verticalPolicy() == QSizePolicy::Ignored)
737 q_cachedSizeHint.setHeight(0);
739 q_cachedMaximumSize = useLayoutItemRect
740 ? toLayoutItemSize(wid->d_func(), smartMaxSize)
744QWidgetItemV2::QWidgetItemV2(QWidget *widget)
745 : QWidgetItem(widget),
746 q_cachedMinimumSize(Dirty, Dirty),
747 q_cachedSizeHint(Dirty, Dirty),
748 q_cachedMaximumSize(Dirty, Dirty),
753 QWidgetPrivate *wd = wid->d_func();
755 wd->widgetItem =
this;
758QWidgetItemV2::~QWidgetItemV2()
761 auto *wd =
static_cast<QWidgetPrivate *>(QObjectPrivate::get(wid));
762 if (wd->widgetItem ==
this)
763 wd->widgetItem =
nullptr;
767QSize QWidgetItemV2::sizeHint()
const
772 if (useSizeCache()) {
773 updateCacheIfNecessary();
774 return q_cachedSizeHint;
776 return QWidgetItem::sizeHint();
780QSize QWidgetItemV2::minimumSize()
const
785 if (useSizeCache()) {
786 updateCacheIfNecessary();
787 return q_cachedMinimumSize;
789 return QWidgetItem::minimumSize();
793QSize QWidgetItemV2::maximumSize()
const
798 if (useSizeCache()) {
799 updateCacheIfNecessary();
800 return q_cachedMaximumSize;
802 return QWidgetItem::maximumSize();
807
808
809
810
811
812
813
814
815
816
817
818
819
821int QWidgetItemV2::heightForWidth(
int width)
const
826 for (
int i = 0; i < q_hfwCacheSize; ++i) {
827 int offset = q_firstCachedHfw + i;
828 const QSize &size = q_cachedHfws[offset % HfwCacheMaxSize];
829 if (size.width() == width) {
830 if (q_hfwCacheSize == HfwCacheMaxSize)
831 q_firstCachedHfw = offset % HfwCacheMaxSize;
832 return size.height();
836 if (q_hfwCacheSize < HfwCacheMaxSize)
838 q_firstCachedHfw = (q_firstCachedHfw + HfwCacheMaxSize - 1) % HfwCacheMaxSize;
840 int height = QWidgetItem::heightForWidth(width);
841 q_cachedHfws[q_firstCachedHfw] = QSize(width, height);
Combined button and popup list for selecting options.
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)