Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qquicklayout_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QQUICKLAYOUT_P_H
5#define QQUICKLAYOUT_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <QPointer>
19#include <QQuickItem>
20#include <QtCore/qflags.h>
21
22#include <QtQuickLayouts/private/qquicklayoutglobal_p.h>
23#include <private/qquickitem_p.h>
24#include <QtQuick/private/qquickitemchangelistener_p.h>
25#include <QtGui/private/qlayoutpolicy_p.h>
26#include <QtGui/qguiapplication.h>
27
29
31Q_DECLARE_LOGGING_CATEGORY(lcQuickLayouts)
32
34class Q_QUICKLAYOUTS_EXPORT QQuickLayout : public QQuickItem, public QQuickItemChangeListener
35
36{
38 QML_NAMED_ELEMENT(Layout)
40 QML_UNCREATABLE("Do not create objects of type Layout.")
42
43public:
50
52 Recursive = 0b001,
53 ApplySizeHints = 0b010
54 };
55
56 Q_DECLARE_FLAGS(EnsureLayoutItemsUpdatedOptions, EnsureLayoutItemsUpdatedOption)
57
58 explicit QQuickLayout(QQuickLayoutPrivate &dd, QQuickItem *parent = nullptr);
60
61 static QQuickLayoutAttached *qmlAttachedProperties(QObject *object);
62
63
64 void componentComplete() override;
65 virtual QSizeF sizeHint(Qt::SizeHint whichSizeHint) const = 0;
66 virtual void setAlignment(QQuickItem *item, Qt::Alignment align) = 0;
67 virtual void setStretchFactor(QQuickItem *item, int stretchFactor, Qt::Orientation orient) = 0;
68
69 virtual void invalidate(QQuickItem * childItem = nullptr);
70 virtual void updateLayoutItems() = 0;
71
72 void ensureLayoutItemsUpdated(EnsureLayoutItemsUpdatedOptions options = {}) const;
73
74 // iterator
75 virtual QQuickItem *itemAt(int index) const = 0;
76 virtual int itemCount() const = 0;
77
78 virtual void rearrange(const QSizeF &);
79
80 static void effectiveSizeHints_helper(QQuickItem *item, QSizeF *cachedSizeHints, QQuickLayoutAttached **info, bool useFallbackToWidthOrHeight);
81 static QLayoutPolicy::Policy effectiveSizePolicy_helper(QQuickItem *item, Qt::Orientation orientation, QQuickLayoutAttached *info);
82 bool shouldIgnoreItem(QQuickItem *child) const;
83 void checkAnchors(QQuickItem *item) const;
84
85 void itemChange(ItemChange change, const ItemChangeData &value) override;
86 void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) override;
87 bool isReady() const;
88 void deactivateRecur();
89
90 bool invalidated() const;
91 bool invalidatedArrangement() const;
92 bool isMirrored() const;
93
94 /* QQuickItemChangeListener */
95 void itemSiblingOrderChanged(QQuickItem *item) override;
96 void itemImplicitWidthChanged(QQuickItem *item) override;
97 void itemImplicitHeightChanged(QQuickItem *item) override;
98 void itemDestroyed(QQuickItem *item) override;
99 void itemVisibilityChanged(QQuickItem *item) override;
100
101 void maybeSubscribeToBaseLineOffsetChanges(QQuickItem *item);
102
103 Q_INVOKABLE void _q_dumpLayoutTree() const;
104 void dumpLayoutTreeRecursive(int level, QString &buf) const;
105
106protected:
107 void updatePolish() override;
108
110 Vertical = 0,
112 NOrientations
113 };
114
115protected Q_SLOTS:
116 void invalidateSenderItem();
117
118private:
119 unsigned m_inUpdatePolish : 1;
120 unsigned m_polishInsideUpdatePolish : 2;
121
122 Q_DECLARE_PRIVATE(QQuickLayout)
123
125};
126
127Q_DECLARE_OPERATORS_FOR_FLAGS(QQuickLayout::EnsureLayoutItemsUpdatedOptions)
128
130{
131 Q_DECLARE_PUBLIC(QQuickLayout)
132public:
133 QQuickLayoutPrivate() : m_dirty(true)
134 , m_dirtyArrangement(true)
135 , m_isReady(false)
136 , m_disableRearrange(true)
137 , m_hasItemChangeListeners(false) {}
138
139 void applySizeHints() const;
140
141protected:
142 /* m_dirty == true means that something in the layout was changed,
143 but its state has not been synced to the internal grid layout engine. It is usually:
144 1. A child item was added or removed from the layout (or made visible/invisble)
145 2. A child item got one of its size hints changed
146 */
147 mutable unsigned m_dirty : 1;
148 /* m_dirtyArrangement == true means that the layout still needs a rearrange despite that
149 * m_dirty == false. This is only used for the case that a layout has been invalidated,
150 * but its new size is the same as the old size (in that case the child layout won't get
151 * a geometryChanged() notification, which rearrange() usually reacts to)
152 */
153 mutable unsigned m_dirtyArrangement : 1;
154 unsigned m_isReady : 1;
155 unsigned m_disableRearrange : 1;
156 unsigned m_hasItemChangeListeners : 1; // if false, we don't need to remove its item change listeners...
157};
158
159
160class Q_QUICKLAYOUTS_EXPORT QQuickLayoutAttached : public QObject
161{
163 Q_PROPERTY(qreal minimumWidth READ minimumWidth WRITE setMinimumWidth NOTIFY minimumWidthChanged FINAL)
164 Q_PROPERTY(qreal minimumHeight READ minimumHeight WRITE setMinimumHeight NOTIFY minimumHeightChanged FINAL)
165 Q_PROPERTY(qreal preferredWidth READ preferredWidth WRITE setPreferredWidth NOTIFY preferredWidthChanged FINAL)
166 Q_PROPERTY(qreal preferredHeight READ preferredHeight WRITE setPreferredHeight NOTIFY preferredHeightChanged FINAL)
167 Q_PROPERTY(qreal maximumWidth READ maximumWidth WRITE setMaximumWidth NOTIFY maximumWidthChanged FINAL)
168 Q_PROPERTY(qreal maximumHeight READ maximumHeight WRITE setMaximumHeight NOTIFY maximumHeightChanged FINAL)
169 Q_PROPERTY(bool fillHeight READ fillHeight WRITE setFillHeight NOTIFY fillHeightChanged FINAL)
170 Q_PROPERTY(bool fillWidth READ fillWidth WRITE setFillWidth NOTIFY fillWidthChanged FINAL)
171 Q_PROPERTY(int row READ row WRITE setRow NOTIFY rowChanged FINAL)
172 Q_PROPERTY(int column READ column WRITE setColumn NOTIFY columnChanged FINAL)
173 Q_PROPERTY(int rowSpan READ rowSpan WRITE setRowSpan NOTIFY rowSpanChanged FINAL)
174 Q_PROPERTY(int columnSpan READ columnSpan WRITE setColumnSpan NOTIFY columnSpanChanged FINAL)
175 Q_PROPERTY(Qt::Alignment alignment READ alignment WRITE setAlignment NOTIFY alignmentChanged FINAL)
176 Q_PROPERTY(int horizontalStretchFactor READ horizontalStretchFactor WRITE setHorizontalStretchFactor NOTIFY horizontalStretchFactorChanged FINAL)
177 Q_PROPERTY(int verticalStretchFactor READ verticalStretchFactor WRITE setVerticalStretchFactor NOTIFY verticalStretchFactorChanged FINAL)
178
179 Q_PROPERTY(qreal margins READ margins WRITE setMargins NOTIFY marginsChanged FINAL)
180 Q_PROPERTY(qreal leftMargin READ leftMargin WRITE setLeftMargin RESET resetLeftMargin NOTIFY leftMarginChanged FINAL)
181 Q_PROPERTY(qreal topMargin READ topMargin WRITE setTopMargin RESET resetTopMargin NOTIFY topMarginChanged FINAL)
182 Q_PROPERTY(qreal rightMargin READ rightMargin WRITE setRightMargin RESET resetRightMargin NOTIFY rightMarginChanged FINAL)
183 Q_PROPERTY(qreal bottomMargin READ bottomMargin WRITE setBottomMargin RESET resetBottomMargin NOTIFY bottomMarginChanged FINAL)
184
185public:
187
188 qreal minimumWidth() const { return !m_isMinimumWidthSet ? sizeHint(Qt::MinimumSize, Qt::Horizontal) : m_minimumWidth; }
189 void setMinimumWidth(qreal width);
190 bool isMinimumWidthSet() const {return m_isMinimumWidthSet; }
191
192 qreal minimumHeight() const { return !m_isMinimumHeightSet ? sizeHint(Qt::MinimumSize, Qt::Vertical) : m_minimumHeight; }
193 void setMinimumHeight(qreal height);
194 bool isMinimumHeightSet() const {return m_isMinimumHeightSet; }
195
196 qreal preferredWidth() const { return m_preferredWidth; }
197 void setPreferredWidth(qreal width);
198 bool isPreferredWidthSet() const {return m_preferredWidth > -1; }
199
200 qreal preferredHeight() const { return m_preferredHeight; }
201 void setPreferredHeight(qreal width);
202 bool isPreferredHeightSet() const {return m_preferredHeight > -1; }
203
204 qreal maximumWidth() const { return !m_isMaximumWidthSet ? sizeHint(Qt::MaximumSize, Qt::Horizontal) : m_maximumWidth; }
205 void setMaximumWidth(qreal width);
206 bool isMaximumWidthSet() const {return m_isMaximumWidthSet; }
207
208 qreal maximumHeight() const { return !m_isMaximumHeightSet ? sizeHint(Qt::MaximumSize, Qt::Vertical) : m_maximumHeight; }
209 void setMaximumHeight(qreal height);
210 bool isMaximumHeightSet() const {return m_isMaximumHeightSet; }
211
212 void setMinimumImplicitSize(const QSizeF &sz);
213 void setMaximumImplicitSize(const QSizeF &sz);
214
215 bool fillWidth() const {
216 if (auto *itemPriv = itemForSizePolicy(m_isFillWidthSet))
217 return (itemPriv->sizePolicy().horizontalPolicy() == QLayoutPolicy::Preferred);
218 return m_fillWidth;
219 }
220 void setFillWidth(bool fill);
221 bool isFillWidthSet() const { return m_isFillWidthSet; }
222
223 bool fillHeight() const {
224 if (auto *itemPriv = itemForSizePolicy(m_isFillHeightSet))
225 return (itemPriv->sizePolicy().verticalPolicy() == QLayoutPolicy::Preferred);
226 return m_fillHeight;
227 }
228 void setFillHeight(bool fill);
229 bool isFillHeightSet() const { return m_isFillHeightSet; }
230
231 int row() const { return qMax(m_row, 0); }
232 void setRow(int row);
233 bool isRowSet() const { return m_row >= 0; }
234 int column() const { return qMax(m_column, 0); }
235 void setColumn(int column);
236 bool isColumnSet() const { return m_column >= 0; }
237
238 int rowSpan() const { return m_rowSpan; }
239 void setRowSpan(int span);
240 int columnSpan() const { return m_columnSpan; }
241 void setColumnSpan(int span);
242
243 Qt::Alignment alignment() const { return m_alignment; }
244 void setAlignment(Qt::Alignment align);
245 bool isAlignmentSet() const {return m_isAlignmentSet; }
246
247 int horizontalStretchFactor() const { return m_horizontalStretch; }
248 void setHorizontalStretchFactor(int stretchFactor);
249 bool isHorizontalStretchFactorSet() const { return m_horizontalStretch > -1; }
250 int verticalStretchFactor() const { return m_verticalStretch; }
251 void setVerticalStretchFactor(int stretchFactor);
252 bool isVerticalStretchFactorSet() const { return m_verticalStretch > -1; }
253
254 qreal margins() const { return m_defaultMargins; }
255 void setMargins(qreal m);
256 bool isMarginsSet() const { return m_isMarginsSet; }
257
258 qreal leftMargin() const { return m_isLeftMarginSet ? m_margins.left() : m_defaultMargins; }
259 void setLeftMargin(qreal m);
260 void resetLeftMargin();
261 bool isLeftMarginSet() const { return m_isLeftMarginSet; }
262
263 qreal topMargin() const { return m_isTopMarginSet ? m_margins.top() : m_defaultMargins; }
264 void setTopMargin(qreal m);
265 void resetTopMargin();
266 bool isTopMarginSet() const {return m_isTopMarginSet; }
267
268 qreal rightMargin() const { return m_isRightMarginSet ? m_margins.right() : m_defaultMargins; }
269 void setRightMargin(qreal m);
270 void resetRightMargin();
271 bool isRightMarginSet() const { return m_isRightMarginSet; }
272
273 qreal bottomMargin() const { return m_isBottomMarginSet ? m_margins.bottom() : m_defaultMargins; }
274 void setBottomMargin(qreal m);
275 void resetBottomMargin();
276 bool isBottomMarginSet() const { return m_isBottomMarginSet; }
277
279 return QMarginsF(leftMargin(), topMargin(), rightMargin(), bottomMargin());
280 }
281
283 bool mirrored = parentLayout() && parentLayout()->isMirrored();
284 if (mirrored)
285 return QMarginsF(rightMargin(), topMargin(), leftMargin(), bottomMargin());
286 else
287 return qMargins();
288 }
289
291 {
292 const bool old = m_changesNotificationEnabled;
293 m_changesNotificationEnabled = enabled;
294 return old;
295 }
296
297 qreal sizeHint(Qt::SizeHint which, Qt::Orientation orientation) const;
298
300 {
301 switch (whichSize) {
302 case Qt::MinimumSize:
303 return o == Qt::Horizontal ? m_isMinimumWidthSet : m_isMinimumHeightSet;
304 case Qt::MaximumSize:
305 return o == Qt::Horizontal ? m_isMaximumWidthSet : m_isMaximumHeightSet;
307 return true; // Layout.preferredWidth is always explicitly set
308 case Qt::MinimumDescent: // Not supported
309 case Qt::NSizeHints:
310 return false;
311 }
312 return false;
313 }
314
316 {
317 QQuickItemPrivate *itemPriv = nullptr;
318 if (!isFillSet && qobject_cast<QQuickItem *>(item()) &&
320 itemPriv = QQuickItemPrivate::get(item());
321 return itemPriv;
322 }
323
345
346private:
347 void invalidateItem();
348 QQuickLayout *parentLayout() const;
349 QQuickItem *item() const;
350private:
351 qreal m_minimumWidth;
352 qreal m_minimumHeight;
353 qreal m_preferredWidth;
354 qreal m_preferredHeight;
355 qreal m_maximumWidth;
356 qreal m_maximumHeight;
357
358 qreal m_defaultMargins;
359 QMarginsF m_margins;
360
361 qreal m_fallbackWidth;
362 qreal m_fallbackHeight;
363
364 // GridLayout specific properties
365 int m_row;
366 int m_column;
367 int m_rowSpan;
368 int m_columnSpan;
369
370 unsigned m_fillWidth : 1;
371 unsigned m_fillHeight : 1;
372 unsigned m_isFillWidthSet : 1;
373 unsigned m_isFillHeightSet : 1;
374 unsigned m_isMinimumWidthSet : 1;
375 unsigned m_isMinimumHeightSet : 1;
376 // preferredWidth and preferredHeight are always explicit, since
377 // their implicit equivalent is implicitWidth and implicitHeight
378 unsigned m_isMaximumWidthSet : 1;
379 unsigned m_isMaximumHeightSet : 1;
380 unsigned m_changesNotificationEnabled : 1;
381 unsigned m_isMarginsSet : 1;
382 unsigned m_isLeftMarginSet : 1;
383 unsigned m_isTopMarginSet : 1;
384 unsigned m_isRightMarginSet : 1;
385 unsigned m_isBottomMarginSet : 1;
386 unsigned m_isAlignmentSet : 1;
387 Qt::Alignment m_alignment;
388 int m_horizontalStretch;
389 int m_verticalStretch;
390 friend class QQuickLayout;
391};
392
394{
395 return static_cast<QQuickLayoutAttached *>(qmlAttachedPropertiesObject<QQuickLayout>(item, create));
396}
397
399
400#endif // QQUICKLAYOUT_P_H
static bool testAttribute(Qt::ApplicationAttribute attribute)
Returns true if attribute attribute is set; otherwise returns false.
static constexpr Policy Preferred
\inmodule QtCore
Definition qmargins.h:270
\inmodule QtCore
Definition qobject.h:103
static QQuickItemPrivate * get(QQuickItem *item)
The QQuickItem class provides the most basic of all visual items in \l {Qt Quick}.
Definition qquickitem.h:63
ItemChange
Used in conjunction with QQuickItem::itemChange() to notify the item about certain types of changes.
Definition qquickitem.h:144
qreal preferredWidth() const
bool isTopMarginSet() const
bool isHorizontalStretchFactorSet() const
bool isFillWidthSet() const
bool isRightMarginSet() const
QMarginsF qMargins() const
qreal minimumHeight() const
qreal preferredHeight() const
Qt::Alignment alignment() const
bool isPreferredHeightSet() const
bool isFillHeightSet() const
bool isMaximumHeightSet() const
bool isAlignmentSet() const
bool isLeftMarginSet() const
int horizontalStretchFactor() const
int verticalStretchFactor() const
bool isMaximumWidthSet() const
QQuickItemPrivate * itemForSizePolicy(bool isFillSet) const
qreal maximumWidth() const
bool isMarginsSet() const
bool isBottomMarginSet() const
qreal topMargin() const
qreal leftMargin() const
bool isExtentExplicitlySet(Qt::Orientation o, Qt::SizeHint whichSize) const
QMarginsF effectiveQMargins() const
qreal maximumHeight() const
void horizontalStretchFactorChanged()
bool isPreferredWidthSet() const
qreal bottomMargin() const
bool isMinimumWidthSet() const
bool setChangesNotificationEnabled(bool enabled)
qreal rightMargin() const
bool isMinimumHeightSet() const
bool isVerticalStretchFactorSet() const
void verticalStretchFactorChanged()
unsigned m_hasItemChangeListeners
virtual void setAlignment(QQuickItem *item, Qt::Alignment align)=0
virtual void setStretchFactor(QQuickItem *item, int stretchFactor, Qt::Orientation orient)=0
virtual void updateLayoutItems()=0
virtual QQuickItem * itemAt(int index) const =0
virtual QSizeF sizeHint(Qt::SizeHint whichSizeHint) const =0
virtual int itemCount() const =0
\inmodule QtCore\reentrant
Definition qrect.h:484
\inmodule QtCore
Definition qsize.h:208
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
uint alignment
Combined button and popup list for selecting options.
Definition qcompare.h:63
Orientation
Definition qnamespace.h:98
@ Horizontal
Definition qnamespace.h:99
@ Vertical
Definition qnamespace.h:100
@ AA_QtQuickUseDefaultSizePolicy
Definition qnamespace.h:426
@ MaximumSize
@ PreferredSize
@ MinimumDescent
@ MinimumSize
@ NSizeHints
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
#define Q_DECLARE_FLAGS(Flags, Enum)
Definition qflags.h:174
#define Q_DECLARE_OPERATORS_FOR_FLAGS(Flags)
Definition qflags.h:194
@ MinimumSize
#define Q_DECLARE_LOGGING_CATEGORY(name)
constexpr const T & qMax(const T &a, const T &b)
Definition qminmax.h:42
const GLfloat * m
GLenum GLuint GLint level
GLint GLsizei GLsizei height
GLuint index
[2]
GLenum GLenum GLsizei const GLuint GLboolean enabled
GLint GLsizei width
GLenum GLuint GLenum GLsizei const GLchar * buf
GLenum GLenum GLsizei void GLsizei void * column
GLenum GLenum GLsizei void * row
GLenum GLenum GLsizei void GLsizei void void * span
#define QML_UNCREATABLE(REASON)
#define QML_NAMED_ELEMENT(NAME)
#define QML_ADDED_IN_VERSION(MAJOR, MINOR)
#define QML_ATTACHED(ATTACHED_TYPE)
QQuickLayoutAttached * attachedLayoutObject(QQuickItem *item, bool create=true)
#define Q_PROPERTY(...)
#define Q_OBJECT
#define Q_INVOKABLE
#define Q_SLOTS
#define Q_SIGNALS
double qreal
Definition qtypes.h:187
#define enabled
label setAlignment(Qt::AlignLeft|Qt::AlignTop)
[0]
ba fill(true)
QGraphicsItem * item
QLayoutItem * child
[0]
QHostInfo info
[0]
view create()
\inmodule QtQuick
Definition qquickitem.h:159