1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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
98
99
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
|
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\page qtquicklayouts-overview.html
\title Qt Quick Layouts Overview
\brief A set of APIs for arranging QML items in a user interface.
Use Qt Quick Layouts to arrange items in a user interface. Qt Quick Layouts
resize their items, which makes them well suited for resizable user
interfaces.
\section1 Key features
Some of the key features of Qt Quick Layouts are:
\list
\li \l{Layout::alignment}{Align} items with the
\l{Layout::alignment}{Layout.alignment} property.
\li Specify \l{Layout::fillWidth}{resizable items} with the
\l{Layout::fillWidth}{Layout.fillWidth} and
\l{Layout::fillHeight}{Layout.fillHeight} properties.
\li Set \l{Size constraints}{size constraints} with the
\l{Layout::minimumWidth}{Layout.minimumWidth},
\l{Layout::preferredWidth}{Layout.preferredWidth}, and
\l{Layout::maximumWidth}{Layout.maximumWidth} properties -- "Width"
can be replaced with "Height" for specifying similar constraints to
the height.
\li You can specify \l {RowLayout::spacing}{spacing} with
\l{RowLayout::spacing}{spacing},
\l{GridLayout::rowSpacing}{rowSpacing},
or \l{GridLayout::columnSpacing}{columnSpacing}.
\li Stretch items both horizontally and vertically with
\l{Layout::horizontalStretchFactor}{stretch factors}.
\endlist
In addition, GridLayout adds these features:
\list
\li \l{Layout::row}{Grid coordinates}, controlled by the
\l{Layout::row}{Layout.row} and \l{Layout::column}{Layout.column}
properties.
\li \l{GridLayout::flow}{Automatic grid coordinates} used together with
the \l{GridLayout::flow}{flow}, \l{GridLayout::rows}{rows}, and
\l{GridLayout::columns}{columns} properties.
\li \l{Layout::columnSpan}{Spans} across rows or columns, that you can
specify with the \l{Layout::rowSpan}{Layout.rowSpan} and
\l{Layout::columnSpan}{Layout.columnSpan} properties.
\endlist
\section1 Getting started
To get started using Qt Quick Layouts, import the QML types into your
application with the following import statement in your \c {.qml} file:
\qml
import QtQuick.Layouts
\endqml
The next step is to create a \l {A simple layout}{simple layout}. You can
also study the \l {Qt Quick Layouts - Basic Example}.
\section2 A simple layout
The intention of using a layout is to rearrange its children whenever the
layout changes size. This means the application must ensure that the layout
gets resized. In the following snippet, the \e RowLayout ensures that by
specifying \c{anchors.fill: parent}. However, you can also achieve this by
other means, such as specifying the \l{Item::width}{width} and
\l{Item::height}{height} properties. In the same snippet, the \e {orange
Rectangle} has a fixed size of \e 100 by \e 150 pixels, and the \e {plum
Rectangle} will expand to occupy all the space it gets allocated.
\snippet qml/layout-simple.qml 1
\target simple-layout-snippet
Layouts are responsible for their children's geometry.
This includes properties such as \l{Item::width}{width},
\l{Item::height}{height}, \l{Item::x}{x}, \l{Item::y}{y},
\l{Item::anchors}{anchors}), etc.
\important Don't specify properties that influence the geometry of child
items in your application. Setting these properties on a child item causes
a conflict of interest, and the result is undefined. This also applies when
the child item is a layout. Therefore, only layouts with no parent layout
can have \c{anchors.fill: parent}.
\section3 Spacing
As seen in the \l {simple-layout-snippet}{previous snippet}, the \e spacing
for the \e RowLayout is set to \e 6. This ensures that all items in the
layout have 6 pixels of spacing between them:
\snippet qml/layout-simple.qml spacing
If you omit specifying a spacing value, the layout will use a default of
\e 5 pixels. The spacing, as well as the \e implicitWidth of any children,
contributes to the \e implicitWidth of the layout. This is important to
keep in mind if you rely on default behavior, as it may impact your layout
design. For example, the two \e {ColumnLayout}s both set
\e {Layout.fillWidth: true} in the following snippet. It's natural to think
that they would both get the same width. However, because of the default 5
pixel spacing between the items in the inner \e RowLayout, the
\e implicitWidth of the first \e ColumnLayout becomes larger, leaving less
room for the second one. For example:
\snippet qml/layout_with_default_spacing.qml layout-with-default-spacing
This snippet will produce a layout that looks like this:
\image layout-with-default-spacing.png "A QML layout with default spacing"
To ensure equal size of these two columns, you can either
\list a
\li set the spacing of the \e RowLayout to \c 0, or
\li set \e preferredWidth to equal values on both \e {ColumnLayout}s.
\endlist
\section2 Specifying preferred size
For each item, the effective preferred size may come from one of several
candidate properties. For determining the effective preferred size, an item
queries these candidate properties in the following order, and will use the
first candidate with a valid width or height.
\table
\header
\li Candidate properties
\li Description
\row
\li \l{Layout::preferredWidth}{Layout.preferredWidth} or
\l{Layout::preferredHeight}{Layout.preferredHeight}
\li These properties are supposed to be modified by the application if
the default implicit size does not give the optimal arrangement.
\row
\li \l{Item::implicitWidth}{implicitWidth} or
\l{Item::implicitHeight}{implicitHeight}.
\li These properties are supposed to be supplied by each item to give a
meaningful ideal size. For example, the size needed to display all
the contents of a \l Text type. An implicit width or height of \c 0
is interpreted as invalid.
\endtable
An item can specify \l{Layout::preferredWidth}{Layout.preferredWidth}
without having to specify
\l{Layout::preferredHeight}{Layout.preferredHeight}. In such cases, the
effective preferred height is determined from the
\l{Item::implicitHeight}{implicitHeight}.
\note If you don't specify neither preferredWidth nor implicitWidth, the
Layout will query \l {Item::}{width} as an ultimate value for the effective
preferred width. However, you shouldn't rely on \l {Item::}{width} as a
source for the effective preferred width, as that may cause unexpected
behavior. For instance, changing the \l{Item::}{width} or
\l{Item::height}{height} properties won't trigger a layout rearrangement,
or the layout might use the actual width and height -- not the width and
height specified in your QML file -- when forced to do a full rebuild.
\section2 Size constraints
Since an item can be resized by its layout, the layout needs to know the
\l{Layout::minimumWidth}{minimum}, \l{Layout::preferredWidth}{preferred},
and \l{Layout::maximumWidth}{maximum} sizes of all items where
\l{Layout::fillWidth}{Layout.fillWidth} or
\l{Layout::fillHeight}{Layout.fillHeight} is set to \e true.
The \l{Layout::preferredWidth}{preferred} width and height is the \e actual
width and height of an item, if the layout is not bound to a specific size
itself. If the layout is set to a specific size, it distributes additional
space based on the ratio of preferred sizes of its items, while taking
minimum and maximum sizes into account. The preferred and implicit sizes
act as ratios and weights when all items set \e fillWidth and
\e fillHeight.
For instance, the following produces a layout with two rectangles lying
side-by-side that stretches horizontally. The \e {orange Rectangle} can be
resized from 50x150 to 300x150, and the \e {plum Rectangle} can be resized
from 100x100 to ∞x100. As long as the minimum and maximum width of each
item isn't exceeded, the plum rectangle will have twice the width of the
orange one.
\snippet qml/windowconstraints.qml rowlayout
\image rowlayout-minimum.png "RowLayout at its minimum"
Combining each item's constraints gives these implicit constraints to the
layout element:
\table
\header
\li
\li minimum
\li preferred
\li maximum
\row
\li implicit constraints (width)
\li 156
\li 306
\li ∞ (\c Number.POSITIVE_INFINITY)
\row
\li implicit constraints (heights)
\li 150
\li 150
\li 150
\endtable
Thus, the layout cannot be narrower than 156, nor can it be taller or
shorter than 150, without breaking any of the constraints of its child items.
\section1 Connecting windows and layouts
You can use normal anchoring concepts to ensure that your layout follows
the window resizing.
\snippet qml/windowconstraints.qml anchoring
You can rely on the size constraints of layouts to ensure that the window
cannot be resized beyond the layout constraints. You can take the size
constraints from the layout and set these constraints on the \e minimumWidth,
\e minimumHeight, \e maximumWidth, and \e maximumHeight of the
\l [Qml]{Window} element. The following code ensures that the window cannot
be resized beyond the constraints of the layout:
\snippet qml/windowconstraints.qml bindconstraints
\note Because \e {layout.Layout.maximumWidth} is infinite in this case, we
cannot bind that to the \e maximumWidth property of Window, as that is an
integer number. Therefore, the maximum width is set to a fixed value of
\c 1000.
Finally, set the initial size of the window to be the layout's implicit
size:
\snippet qml/windowconstraints.qml binddefaultsize
\section1 Spanning and stretching Items
Use \l {Layout::columnSpan}{spans} in a GridLayout to make child items
occupy more than one cell. For example, you may have a GridLayout with six
cells across two rows. The top row contains the \e {Item}s item1, item2,
and item3. The bottom row contains the \e Item item4, which specifies
\e {columnSpan: 3} and \e {alignment: Qt.AlignHCenter}. This places item4
in the middle of the three cells that make up the bottom row. The following
snippet serves as an example:
\snippet qml/gridlayout_with_span.qml gridlayout-with-span
The size of rows and columns are given implicitly by their contents.
For example, a Button may impact the width of the column it's in, or the
height of the row it's in. This means GridLayout doesn't have uniform
distribution. Because of this, you can't use a span to stretch a layout.
To manipulate the stretch of an item or layout, use
\l {Layout::horizontalStretchFactor}{stretchFactor}s and/or size hints
instead.
\note When setting implicit or preferred sizes, don't bind the respective
properties to the width or height of the layout itself or items it depends
on for its size calculations, as this can cause cyclic dependencies that
are hard to track down.
*/
|