Qt 6.x
The Qt SDK
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
28
30Q_DECLARE_LOGGING_CATEGORY(lcQuickLayouts)
31
33class Q_QUICKLAYOUTS_PRIVATE_EXPORT QQuickLayout : public QQuickItem, public QQuickItemChangeListener
34
35{
37 QML_NAMED_ELEMENT(Layout)
39 QML_UNCREATABLE("Do not create objects of type Layout.")
41
42public:
43 enum SizeHint {
47 NSizes
48 };
49
51 Recursive = 0b001,
52 ApplySizeHints = 0b010
53 };
54
55 Q_DECLARE_FLAGS(EnsureLayoutItemsUpdatedOptions, EnsureLayoutItemsUpdatedOption)
56
57 explicit QQuickLayout(QQuickLayoutPrivate &dd, QQuickItem *parent = nullptr);
59
60 static QQuickLayoutAttached *qmlAttachedProperties(QObject *object);
61
62
63 void componentComplete() override;
64 virtual QSizeF sizeHint(Qt::SizeHint whichSizeHint) const = 0;
65 virtual void setAlignment(QQuickItem *item, Qt::Alignment align) = 0;
66 virtual void setStretchFactor(QQuickItem *item, int stretchFactor, Qt::Orientation orient) = 0;
67
68 virtual void invalidate(QQuickItem * childItem = nullptr);
69 virtual void updateLayoutItems() = 0;
70
71 void ensureLayoutItemsUpdated(EnsureLayoutItemsUpdatedOptions options = {}) const;
72
73 // iterator
74 virtual QQuickItem *itemAt(int index) const = 0;
75 virtual int itemCount() const = 0;
76
77 virtual void rearrange(const QSizeF &);
78
79 static void effectiveSizeHints_helper(QQuickItem *item, QSizeF *cachedSizeHints, QQuickLayoutAttached **info, bool useFallbackToWidthOrHeight);
80 static QLayoutPolicy::Policy effectiveSizePolicy_helper(QQuickItem *item, Qt::Orientation orientation, QQuickLayoutAttached *info);
81 bool shouldIgnoreItem(QQuickItem *child) const;
82 void checkAnchors(QQuickItem *item) const;
83
84 void itemChange(ItemChange change, const ItemChangeData &value) override;
85 void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) override;
86 bool isReady() const;
87 void deactivateRecur();
88
89 bool invalidated() const;
90 bool invalidatedArrangement() const;
91 bool isMirrored() const;
92
93 /* QQuickItemChangeListener */
97 void itemDestroyed(QQuickItem *item) override;
99
100 void maybeSubscribeToBaseLineOffsetChanges(QQuickItem *item);
101
102 Q_INVOKABLE void _q_dumpLayoutTree() const;
103 void dumpLayoutTreeRecursive(int level, QString &buf) const;
104
105protected:
106 void updatePolish() override;
107
109 Vertical = 0,
111 NOrientations
112 };
113
114protected Q_SLOTS:
115 void invalidateSenderItem();
116
117private:
118 unsigned m_inUpdatePolish : 1;
119 unsigned m_polishInsideUpdatePolish : 2;
120
121 Q_DECLARE_PRIVATE(QQuickLayout)
122
124};
125
126Q_DECLARE_OPERATORS_FOR_FLAGS(QQuickLayout::EnsureLayoutItemsUpdatedOptions)
127
129{
130 Q_DECLARE_PUBLIC(QQuickLayout)
131public:
132 QQuickLayoutPrivate() : m_dirty(true)
133 , m_dirtyArrangement(true)
134 , m_isReady(false)
135 , m_disableRearrange(true)
136 , m_hasItemChangeListeners(false) {}
137
138 void applySizeHints() const;
139
140protected:
141 /* m_dirty == true means that something in the layout was changed,
142 but its state has not been synced to the internal grid layout engine. It is usually:
143 1. A child item was added or removed from the layout (or made visible/invisble)
144 2. A child item got one of its size hints changed
145 */
146 mutable unsigned m_dirty : 1;
147 /* m_dirtyArrangement == true means that the layout still needs a rearrange despite that
148 * m_dirty == false. This is only used for the case that a layout has been invalidated,
149 * but its new size is the same as the old size (in that case the child layout won't get
150 * a geometryChanged() notification, which rearrange() usually reacts to)
151 */
152 mutable unsigned m_dirtyArrangement : 1;
153 unsigned m_isReady : 1;
154 unsigned m_disableRearrange : 1;
155 unsigned m_hasItemChangeListeners : 1; // if false, we don't need to remove its item change listeners...
156};
157
158
159class Q_QUICKLAYOUTS_PRIVATE_EXPORT QQuickLayoutAttached : public QObject
160{
162 Q_PROPERTY(qreal minimumWidth READ minimumWidth WRITE setMinimumWidth NOTIFY minimumWidthChanged FINAL)
163 Q_PROPERTY(qreal minimumHeight READ minimumHeight WRITE setMinimumHeight NOTIFY minimumHeightChanged FINAL)
164 Q_PROPERTY(qreal preferredWidth READ preferredWidth WRITE setPreferredWidth NOTIFY preferredWidthChanged FINAL)
165 Q_PROPERTY(qreal preferredHeight READ preferredHeight WRITE setPreferredHeight NOTIFY preferredHeightChanged FINAL)
166 Q_PROPERTY(qreal maximumWidth READ maximumWidth WRITE setMaximumWidth NOTIFY maximumWidthChanged FINAL)
167 Q_PROPERTY(qreal maximumHeight READ maximumHeight WRITE setMaximumHeight NOTIFY maximumHeightChanged FINAL)
168 Q_PROPERTY(bool fillHeight READ fillHeight WRITE setFillHeight NOTIFY fillHeightChanged FINAL)
169 Q_PROPERTY(bool fillWidth READ fillWidth WRITE setFillWidth NOTIFY fillWidthChanged FINAL)
170 Q_PROPERTY(int row READ row WRITE setRow NOTIFY rowChanged FINAL)
171 Q_PROPERTY(int column READ column WRITE setColumn NOTIFY columnChanged FINAL)
172 Q_PROPERTY(int rowSpan READ rowSpan WRITE setRowSpan NOTIFY rowSpanChanged FINAL)
173 Q_PROPERTY(int columnSpan READ columnSpan WRITE setColumnSpan NOTIFY columnSpanChanged FINAL)
174 Q_PROPERTY(Qt::Alignment alignment READ alignment WRITE setAlignment NOTIFY alignmentChanged FINAL)
175 Q_PROPERTY(int horizontalStretchFactor READ horizontalStretchFactor WRITE setHorizontalStretchFactor NOTIFY horizontalStretchFactorChanged FINAL)
176 Q_PROPERTY(int verticalStretchFactor READ verticalStretchFactor WRITE setVerticalStretchFactor NOTIFY verticalStretchFactorChanged FINAL)
177
178 Q_PROPERTY(qreal margins READ margins WRITE setMargins NOTIFY marginsChanged FINAL)
179 Q_PROPERTY(qreal leftMargin READ leftMargin WRITE setLeftMargin RESET resetLeftMargin NOTIFY leftMarginChanged FINAL)
180 Q_PROPERTY(qreal topMargin READ topMargin WRITE setTopMargin RESET resetTopMargin NOTIFY topMarginChanged FINAL)
181 Q_PROPERTY(qreal rightMargin READ rightMargin WRITE setRightMargin RESET resetRightMargin NOTIFY rightMarginChanged FINAL)
182 Q_PROPERTY(qreal bottomMargin READ bottomMargin WRITE setBottomMargin RESET resetBottomMargin NOTIFY bottomMarginChanged FINAL)
183
184public:
186
187 qreal minimumWidth() const { return !m_isMinimumWidthSet ? sizeHint(Qt::MinimumSize, Qt::Horizontal) : m_minimumWidth; }
188 void setMinimumWidth(qreal width);
189 bool isMinimumWidthSet() const {return m_isMinimumWidthSet; }
190
191 qreal minimumHeight() const { return !m_isMinimumHeightSet ? sizeHint(Qt::MinimumSize, Qt::Vertical) : m_minimumHeight; }
192 void setMinimumHeight(qreal height);
193 bool isMinimumHeightSet() const {return m_isMinimumHeightSet; }
194
195 qreal preferredWidth() const { return m_preferredWidth; }
196 void setPreferredWidth(qreal width);
197 bool isPreferredWidthSet() const {return m_preferredWidth > -1; }
198
199 qreal preferredHeight() const { return m_preferredHeight; }
200 void setPreferredHeight(qreal width);
201 bool isPreferredHeightSet() const {return m_preferredHeight > -1; }
202
203 qreal maximumWidth() const { return !m_isMaximumWidthSet ? sizeHint(Qt::MaximumSize, Qt::Horizontal) : m_maximumWidth; }
204 void setMaximumWidth(qreal width);
205 bool isMaximumWidthSet() const {return m_isMaximumWidthSet; }
206
207 qreal maximumHeight() const { return !m_isMaximumHeightSet ? sizeHint(Qt::MaximumSize, Qt::Vertical) : m_maximumHeight; }
208 void setMaximumHeight(qreal height);
209 bool isMaximumHeightSet() const {return m_isMaximumHeightSet; }
210
211 void setMinimumImplicitSize(const QSizeF &sz);
212 void setMaximumImplicitSize(const QSizeF &sz);
213
214 bool fillWidth() const { return m_fillWidth; }
215 void setFillWidth(bool fill);
216 bool isFillWidthSet() const { return m_isFillWidthSet; }
217
218 bool fillHeight() const { return m_fillHeight; }
219 void setFillHeight(bool fill);
220 bool isFillHeightSet() const { return m_isFillHeightSet; }
221
222 int row() const { return qMax(m_row, 0); }
223 void setRow(int row);
224 bool isRowSet() const { return m_row >= 0; }
225 int column() const { return qMax(m_column, 0); }
226 void setColumn(int column);
227 bool isColumnSet() const { return m_column >= 0; }
228
229 int rowSpan() const { return m_rowSpan; }
230 void setRowSpan(int span);
231 int columnSpan() const { return m_columnSpan; }
232 void setColumnSpan(int span);
233
234 Qt::Alignment alignment() const { return m_alignment; }
235 void setAlignment(Qt::Alignment align);
236 bool isAlignmentSet() const {return m_isAlignmentSet; }
237
238 int horizontalStretchFactor() const { return m_horizontalStretch; }
239 void setHorizontalStretchFactor(int stretchFactor);
240 bool isHorizontalStretchFactorSet() const { return m_horizontalStretch > -1; }
241 int verticalStretchFactor() const { return m_verticalStretch; }
242 void setVerticalStretchFactor(int stretchFactor);
243 bool isVerticalStretchFactorSet() const { return m_verticalStretch > -1; }
244
245 qreal margins() const { return m_defaultMargins; }
246 void setMargins(qreal m);
247 bool isMarginsSet() const { return m_isMarginsSet; }
248
249 qreal leftMargin() const { return m_isLeftMarginSet ? m_margins.left() : m_defaultMargins; }
250 void setLeftMargin(qreal m);
251 void resetLeftMargin();
252 bool isLeftMarginSet() const { return m_isLeftMarginSet; }
253
254 qreal topMargin() const { return m_isTopMarginSet ? m_margins.top() : m_defaultMargins; }
255 void setTopMargin(qreal m);
256 void resetTopMargin();
257 bool isTopMarginSet() const {return m_isTopMarginSet; }
258
259 qreal rightMargin() const { return m_isRightMarginSet ? m_margins.right() : m_defaultMargins; }
260 void setRightMargin(qreal m);
261 void resetRightMargin();
262 bool isRightMarginSet() const { return m_isRightMarginSet; }
263
264 qreal bottomMargin() const { return m_isBottomMarginSet ? m_margins.bottom() : m_defaultMargins; }
265 void setBottomMargin(qreal m);
266 void resetBottomMargin();
267 bool isBottomMarginSet() const { return m_isBottomMarginSet; }
268
270 return QMarginsF(leftMargin(), topMargin(), rightMargin(), bottomMargin());
271 }
272
274 bool mirrored = parentLayout() && parentLayout()->isMirrored();
275 if (mirrored)
276 return QMarginsF(rightMargin(), topMargin(), leftMargin(), bottomMargin());
277 else
278 return qMargins();
279 }
280
282 {
283 const bool old = m_changesNotificationEnabled;
284 m_changesNotificationEnabled = enabled;
285 return old;
286 }
287
288 qreal sizeHint(Qt::SizeHint which, Qt::Orientation orientation) const;
289
291 {
292 switch (whichSize) {
293 case Qt::MinimumSize:
294 return o == Qt::Horizontal ? m_isMinimumWidthSet : m_isMinimumHeightSet;
295 case Qt::MaximumSize:
296 return o == Qt::Horizontal ? m_isMaximumWidthSet : m_isMaximumHeightSet;
298 return true; // Layout.preferredWidth is always explicitly set
299 case Qt::MinimumDescent: // Not supported
300 case Qt::NSizeHints:
301 return false;
302 }
303 return false;
304 }
305
327
328private:
329 void invalidateItem();
330 QQuickLayout *parentLayout() const;
331 QQuickItem *item() const;
332private:
333 qreal m_minimumWidth;
334 qreal m_minimumHeight;
335 qreal m_preferredWidth;
336 qreal m_preferredHeight;
337 qreal m_maximumWidth;
338 qreal m_maximumHeight;
339
340 qreal m_defaultMargins;
341 QMarginsF m_margins;
342
343 qreal m_fallbackWidth;
344 qreal m_fallbackHeight;
345
346 // GridLayout specific properties
347 int m_row;
348 int m_column;
349 int m_rowSpan;
350 int m_columnSpan;
351
352 unsigned m_fillWidth : 1;
353 unsigned m_fillHeight : 1;
354 unsigned m_isFillWidthSet : 1;
355 unsigned m_isFillHeightSet : 1;
356 unsigned m_isMinimumWidthSet : 1;
357 unsigned m_isMinimumHeightSet : 1;
358 // preferredWidth and preferredHeight are always explicit, since
359 // their implicit equivalent is implicitWidth and implicitHeight
360 unsigned m_isMaximumWidthSet : 1;
361 unsigned m_isMaximumHeightSet : 1;
362 unsigned m_changesNotificationEnabled : 1;
363 unsigned m_isMarginsSet : 1;
364 unsigned m_isLeftMarginSet : 1;
365 unsigned m_isTopMarginSet : 1;
366 unsigned m_isRightMarginSet : 1;
367 unsigned m_isBottomMarginSet : 1;
368 unsigned m_isAlignmentSet : 1;
369 Qt::Alignment m_alignment;
370 int m_horizontalStretch;
371 int m_verticalStretch;
372 friend class QQuickLayout;
373};
374
376{
377 return static_cast<QQuickLayoutAttached *>(qmlAttachedPropertiesObject<QQuickLayout>(item, create));
378}
379
381
383
384#endif // QQUICKLAYOUT_P_H
\inmodule QtCore
Definition qmargins.h:274
\inmodule QtCore
Definition qobject.h:90
virtual void itemSiblingOrderChanged(QQuickItem *)
virtual void itemImplicitWidthChanged(QQuickItem *)
virtual void itemDestroyed(QQuickItem *)
virtual void itemVisibilityChanged(QQuickItem *)
virtual void itemImplicitHeightChanged(QQuickItem *)
The QQuickItem class provides the most basic of all visual items in \l {Qt Quick}.
Definition qquickitem.h:64
virtual void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry)
void componentComplete() override
\reimp Derived classes should call the base class method before adding their own actions to perform a...
virtual void itemChange(ItemChange, const ItemChangeData &)
Called when change occurs for this item.
virtual void updatePolish()
This function should perform any layout as required for this item.
ItemChange
Used in conjunction with QQuickItem::itemChange() to notify the item about certain types of changes.
Definition qquickitem.h:143
bool enabled
\qmlproperty bool QtQuick::Item::enabled
Definition qquickitem.h:80
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
qreal maximumWidth() const
bool isMarginsSet() const
qreal minimumWidth() 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()
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:483
\inmodule QtCore
Definition qsize.h:207
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
uint alignment
Combined button and popup list for selecting options.
Orientation
Definition qnamespace.h:97
@ Horizontal
Definition qnamespace.h:98
@ Vertical
Definition qnamespace.h:99
@ 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_DECLARE_TYPE(TYPE)
Definition qqml.h:19
#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:92
label setAlignment(Qt::AlignLeft|Qt::AlignTop)
[0]
QFileInfo info(fileName)
[8]
ba fill(true)
QGraphicsItem * item
QLayoutItem * child
[0]
view create()
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent
\inmodule QtQuick
Definition qquickitem.h:158