35class Q_QUICKLAYOUTS_EXPORT
QQuickLayout :
public QQuickItem,
public QQuickItemChangeListener
39 QML_NAMED_ELEMENT(Layout)
40 QML_ADDED_IN_VERSION(1, 0)
41 QML_UNCREATABLE(
"Do not create objects of type Layout.")
42 QML_ATTACHED(QQuickLayoutAttached)
52 enum EnsureLayoutItemsUpdatedOption {
54 ApplySizeHints = 0b010
58 SizePolicyImplicit = 1,
63 Q_DECLARE_FLAGS(EnsureLayoutItemsUpdatedOptions, EnsureLayoutItemsUpdatedOption)
65 explicit QQuickLayout(QQuickLayoutPrivate &dd, QQuickItem *parent =
nullptr);
68 static QQuickLayoutAttached *qmlAttachedProperties(QObject *object);
71 void componentComplete() override;
72 virtual QSizeF sizeHint(Qt::SizeHint whichSizeHint)
const = 0;
73 virtual void setAlignment(QQuickItem *item, Qt::Alignment align) = 0;
74 virtual void setStretchFactor(QQuickItem *item,
int stretchFactor, Qt::Orientation orient) = 0;
76 virtual void invalidate(QQuickItem * childItem =
nullptr);
77 virtual void updateLayoutItems() = 0;
79 void ensureLayoutItemsUpdated(EnsureLayoutItemsUpdatedOptions options = {})
const;
82 virtual QQuickItem *itemAt(
int index)
const = 0;
83 virtual int itemCount()
const = 0;
85 virtual void rearrange(
const QSizeF &);
87 static void effectiveSizeHints_helper(QQuickItem *item, QSizeF *cachedSizeHints, QQuickLayoutAttached **info,
bool useFallbackToWidthOrHeight);
88 static QLayoutPolicy::Policy effectiveSizePolicy_helper(QQuickItem *item, Qt::Orientation orientation, QQuickLayoutAttached *info);
89 bool shouldIgnoreItem(QQuickItem *child)
const;
90 void checkAnchors(QQuickItem *item)
const;
92 void itemChange(ItemChange change,
const ItemChangeData &value) override;
93 void geometryChange(
const QRectF &newGeometry,
const QRectF &oldGeometry) override;
95 void deactivateRecur();
97 bool invalidated()
const;
98 bool invalidatedArrangement()
const;
99 bool isMirrored()
const;
102 void itemSiblingOrderChanged(QQuickItem *item) override;
103 void itemImplicitWidthChanged(QQuickItem *item) override;
104 void itemImplicitHeightChanged(QQuickItem *item) override;
105 void itemDestroyed(QQuickItem *item) override;
106 void itemVisibilityChanged(QQuickItem *item) override;
108 void maybeSubscribeToBaseLineOffsetChanges(QQuickItem *item);
110 Q_INVOKABLE
void _q_dumpLayoutTree()
const;
111 void dumpLayoutTreeRecursive(
int level, QString &buf)
const;
114 void updatePolish() override;
123 void invalidateSenderItem();
126 unsigned m_inUpdatePolish : 1;
127 unsigned m_polishInsideUpdatePolish : 2;
129 Q_DECLARE_PRIVATE(QQuickLayout)
131 friend class QQuickLayoutAttached;
170 Q_PROPERTY(qreal minimumWidth READ minimumWidth WRITE setMinimumWidth NOTIFY minimumWidthChanged FINAL)
171 Q_PROPERTY(qreal minimumHeight READ minimumHeight WRITE setMinimumHeight NOTIFY minimumHeightChanged FINAL)
172 Q_PROPERTY(qreal preferredWidth READ preferredWidth WRITE setPreferredWidth NOTIFY preferredWidthChanged FINAL)
173 Q_PROPERTY(qreal preferredHeight READ preferredHeight WRITE setPreferredHeight NOTIFY preferredHeightChanged FINAL)
174 Q_PROPERTY(qreal maximumWidth READ maximumWidth WRITE setMaximumWidth NOTIFY maximumWidthChanged FINAL)
175 Q_PROPERTY(qreal maximumHeight READ maximumHeight WRITE setMaximumHeight NOTIFY maximumHeightChanged FINAL)
176 Q_PROPERTY(
bool fillHeight READ fillHeight WRITE setFillHeight NOTIFY fillHeightChanged FINAL)
177 Q_PROPERTY(
bool fillWidth READ fillWidth WRITE setFillWidth NOTIFY fillWidthChanged FINAL)
178 Q_PROPERTY(QQuickLayout::SizePolicy useDefaultSizePolicy READ useDefaultSizePolicy WRITE setUseDefaultSizePolicy NOTIFY useDefaultSizePolicyChanged FINAL)
179 Q_PROPERTY(
int row READ row WRITE setRow NOTIFY rowChanged FINAL)
180 Q_PROPERTY(
int column READ column WRITE setColumn NOTIFY columnChanged FINAL)
181 Q_PROPERTY(
int rowSpan READ rowSpan WRITE setRowSpan NOTIFY rowSpanChanged FINAL)
182 Q_PROPERTY(
int columnSpan READ columnSpan WRITE setColumnSpan NOTIFY columnSpanChanged FINAL)
183 Q_PROPERTY(Qt::Alignment alignment READ alignment WRITE setAlignment NOTIFY alignmentChanged FINAL)
184 Q_PROPERTY(
int horizontalStretchFactor READ horizontalStretchFactor WRITE setHorizontalStretchFactor NOTIFY horizontalStretchFactorChanged FINAL)
185 Q_PROPERTY(
int verticalStretchFactor READ verticalStretchFactor WRITE setVerticalStretchFactor NOTIFY verticalStretchFactorChanged FINAL)
187 Q_PROPERTY(qreal margins READ margins WRITE setMargins NOTIFY marginsChanged FINAL)
188 Q_PROPERTY(qreal leftMargin READ leftMargin WRITE setLeftMargin RESET resetLeftMargin NOTIFY leftMarginChanged FINAL)
189 Q_PROPERTY(qreal topMargin READ topMargin WRITE setTopMargin RESET resetTopMargin NOTIFY topMarginChanged FINAL)
190 Q_PROPERTY(qreal rightMargin READ rightMargin WRITE setRightMargin RESET resetRightMargin NOTIFY rightMarginChanged FINAL)
191 Q_PROPERTY(qreal bottomMargin READ bottomMargin WRITE setBottomMargin RESET resetBottomMargin NOTIFY bottomMarginChanged FINAL)
194 QQuickLayoutAttached(QObject *object);
196 qreal minimumWidth()
const {
return !m_isMinimumWidthSet ? sizeHint(Qt::MinimumSize, Qt::Horizontal) : m_minimumWidth; }
197 void setMinimumWidth(qreal width);
198 bool isMinimumWidthSet()
const {
return m_isMinimumWidthSet; }
200 qreal minimumHeight()
const {
return !m_isMinimumHeightSet ? sizeHint(Qt::MinimumSize, Qt::Vertical) : m_minimumHeight; }
201 void setMinimumHeight(qreal height);
202 bool isMinimumHeightSet()
const {
return m_isMinimumHeightSet; }
204 qreal preferredWidth()
const {
return m_preferredWidth; }
205 void setPreferredWidth(qreal width);
206 bool isPreferredWidthSet()
const {
return m_preferredWidth > -1; }
208 qreal preferredHeight()
const {
return m_preferredHeight; }
209 void setPreferredHeight(qreal width);
210 bool isPreferredHeightSet()
const {
return m_preferredHeight > -1; }
212 qreal maximumWidth()
const {
return !m_isMaximumWidthSet ? sizeHint(Qt::MaximumSize, Qt::Horizontal) : m_maximumWidth; }
213 void setMaximumWidth(qreal width);
214 bool isMaximumWidthSet()
const {
return m_isMaximumWidthSet; }
216 qreal maximumHeight()
const {
return !m_isMaximumHeightSet ? sizeHint(Qt::MaximumSize, Qt::Vertical) : m_maximumHeight; }
217 void setMaximumHeight(qreal height);
218 bool isMaximumHeightSet()
const {
return m_isMaximumHeightSet; }
220 void setMinimumImplicitSize(
const QSizeF &sz);
221 void setMaximumImplicitSize(
const QSizeF &sz);
223 bool fillWidth()
const {
224 bool effectiveFillWidth = m_fillWidth;
225 if (!m_isFillWidthSet && qobject_cast<QQuickLayout *>(item())) {
226 effectiveFillWidth =
true;
227 }
else if (
auto *itemPriv = itemForSizePolicy(m_isFillWidthSet)) {
228 QLayoutPolicy::Policy hPolicy = itemPriv->sizePolicy().horizontalPolicy();
229 effectiveFillWidth = (hPolicy & QLayoutPolicy::GrowFlag);
231 return effectiveFillWidth;
233 void setFillWidth(
bool fill);
234 bool isFillWidthSet()
const {
return m_isFillWidthSet; }
236 bool fillHeight()
const {
237 bool effectiveFillHeight = m_fillHeight;
238 if (!m_isFillHeightSet && qobject_cast<QQuickLayout *>(item())) {
239 effectiveFillHeight =
true;
240 }
else if (
auto *itemPriv = itemForSizePolicy(m_isFillHeightSet)) {
241 QLayoutPolicy::Policy vPolicy = itemPriv->sizePolicy().verticalPolicy();
242 effectiveFillHeight = (vPolicy & QLayoutPolicy::GrowFlag);
244 return effectiveFillHeight;
246 void setFillHeight(
bool fill);
247 bool isFillHeightSet()
const {
return m_isFillHeightSet; }
249 QQuickLayout::SizePolicy useDefaultSizePolicy()
const {
250 const bool appDefSizePolicy = QGuiApplication::testAttribute(Qt::AA_QtQuickUseDefaultSizePolicy);
251 return (m_isUseDefaultSizePolicySet ? m_useDefaultSizePolicy : (appDefSizePolicy ? QQuickLayout::SizePolicyImplicit : QQuickLayout::SizePolicyExplicit));
253 void setUseDefaultSizePolicy(QQuickLayout::SizePolicy sizePolicy);
255 int row()
const {
return qMax(m_row, 0); }
256 void setRow(
int row);
257 bool isRowSet()
const {
return m_row >= 0; }
258 int column()
const {
return qMax(m_column, 0); }
259 void setColumn(
int column);
260 bool isColumnSet()
const {
return m_column >= 0; }
262 int rowSpan()
const {
return m_rowSpan; }
263 void setRowSpan(
int span);
264 int columnSpan()
const {
return m_columnSpan; }
265 void setColumnSpan(
int span);
267 Qt::Alignment alignment()
const {
return m_alignment; }
268 void setAlignment(Qt::Alignment align);
269 bool isAlignmentSet()
const {
return m_isAlignmentSet; }
271 int horizontalStretchFactor()
const {
return m_horizontalStretch; }
272 void setHorizontalStretchFactor(
int stretchFactor);
273 bool isHorizontalStretchFactorSet()
const {
return m_horizontalStretch > -1; }
274 int verticalStretchFactor()
const {
return m_verticalStretch; }
275 void setVerticalStretchFactor(
int stretchFactor);
276 bool isVerticalStretchFactorSet()
const {
return m_verticalStretch > -1; }
278 qreal margins()
const {
return m_defaultMargins; }
279 void setMargins(qreal m);
280 bool isMarginsSet()
const {
return m_isMarginsSet; }
282 qreal leftMargin()
const {
return m_isLeftMarginSet ? m_margins.left() : m_defaultMargins; }
283 void setLeftMargin(qreal m);
284 void resetLeftMargin();
285 bool isLeftMarginSet()
const {
return m_isLeftMarginSet; }
287 qreal topMargin()
const {
return m_isTopMarginSet ? m_margins.top() : m_defaultMargins; }
288 void setTopMargin(qreal m);
289 void resetTopMargin();
290 bool isTopMarginSet()
const {
return m_isTopMarginSet; }
292 qreal rightMargin()
const {
return m_isRightMarginSet ? m_margins.right() : m_defaultMargins; }
293 void setRightMargin(qreal m);
294 void resetRightMargin();
295 bool isRightMarginSet()
const {
return m_isRightMarginSet; }
297 qreal bottomMargin()
const {
return m_isBottomMarginSet ? m_margins.bottom() : m_defaultMargins; }
298 void setBottomMargin(qreal m);
299 void resetBottomMargin();
300 bool isBottomMarginSet()
const {
return m_isBottomMarginSet; }
302 QMarginsF qMargins()
const {
303 return QMarginsF(leftMargin(), topMargin(), rightMargin(), bottomMargin());
306 QMarginsF effectiveQMargins()
const {
307 bool mirrored = parentLayout() && parentLayout()->isMirrored();
309 return QMarginsF(rightMargin(), topMargin(), leftMargin(), bottomMargin());
314 bool setChangesNotificationEnabled(
bool enabled)
316 const bool old = m_changesNotificationEnabled;
317 m_changesNotificationEnabled = enabled;
321 qreal sizeHint(Qt::SizeHint which, Qt::Orientation orientation)
const;
323 bool isExtentExplicitlySet(Qt::Orientation o, Qt::SizeHint whichSize)
const
326 case Qt::MinimumSize:
327 return o == Qt::Horizontal ? m_isMinimumWidthSet : m_isMinimumHeightSet;
328 case Qt::MaximumSize:
329 return o == Qt::Horizontal ? m_isMaximumWidthSet : m_isMaximumHeightSet;
330 case Qt::PreferredSize:
332 case Qt::MinimumDescent:
339 QQuickItemPrivate *itemForSizePolicy(
bool isFillSet)
const
341 QQuickItemPrivate *itemPriv =
nullptr;
342 if (!isFillSet && qobject_cast<QQuickItem *>(item()) &&
343 QGuiApplication::testAttribute(Qt::AA_QtQuickUseDefaultSizePolicy))
344 itemPriv = QQuickItemPrivate::get(item());
349 void minimumWidthChanged();
350 void minimumHeightChanged();
351 void preferredWidthChanged();
352 void preferredHeightChanged();
353 void maximumWidthChanged();
354 void maximumHeightChanged();
355 void fillWidthChanged();
356 void fillHeightChanged();
357 void useDefaultSizePolicyChanged();
358 void leftMarginChanged();
359 void topMarginChanged();
360 void rightMarginChanged();
361 void bottomMarginChanged();
362 void marginsChanged();
364 void columnChanged();
365 void rowSpanChanged();
366 void columnSpanChanged();
367 void alignmentChanged();
368 void horizontalStretchFactorChanged();
369 void verticalStretchFactorChanged();
372 void invalidateItem();
373 QQuickLayout *parentLayout()
const;
374 QQuickItem *item()
const;
376 qreal m_minimumWidth;
377 qreal m_minimumHeight;
378 qreal m_preferredWidth;
379 qreal m_preferredHeight;
380 qreal m_maximumWidth;
381 qreal m_maximumHeight;
383 qreal m_defaultMargins;
386 qreal m_fallbackWidth;
387 qreal m_fallbackHeight;
395 unsigned m_fillWidth : 1;
396 unsigned m_fillHeight : 1;
397 unsigned m_isFillWidthSet : 1;
398 unsigned m_isFillHeightSet : 1;
399 unsigned m_isUseDefaultSizePolicySet: 1;
400 QQuickLayout::SizePolicy m_useDefaultSizePolicy;
401 unsigned m_isMinimumWidthSet : 1;
402 unsigned m_isMinimumHeightSet : 1;
405 unsigned m_isMaximumWidthSet : 1;
406 unsigned m_isMaximumHeightSet : 1;
407 unsigned m_changesNotificationEnabled : 1;
408 unsigned m_isMarginsSet : 1;
409 unsigned m_isLeftMarginSet : 1;
410 unsigned m_isTopMarginSet : 1;
411 unsigned m_isRightMarginSet : 1;
412 unsigned m_isBottomMarginSet : 1;
413 unsigned m_isAlignmentSet : 1;
414 Qt::Alignment m_alignment;
415 int m_horizontalStretch;
416 int m_verticalStretch;
417 friend class QQuickLayout;