Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
anchors.qdoc
Go to the documentation of this file.
1
// Copyright (C) 2017 The Qt Company Ltd.
2
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
3
4
/*!
5
\page qtquick-positioning-anchors.html
6
\title Positioning with Anchors
7
\brief placing items with anchor properties
8
9
\keyword anchor-layout
10
In addition to the more traditional \l Grid, \l Row, and \l Column,
11
Qt Quick also provides a way to layout items using the concept of \e anchors.
12
Each item can be thought of as having a set of 7 invisible "anchor lines":
13
\l {Item::anchors.left}{left}, \l {Item::anchors.horizontalCenter}{horizontalCenter},
14
\l {Item::anchors.right}{right}, \l {Item::anchors.top}{top},
15
\l {Item::anchors.verticalCenter}{verticalCenter}, \l {Item::anchors.baseline}{baseline},
16
and \l {Item::anchors.bottom}{bottom}.
17
18
\image edges_qml.png
19
20
The baseline (not pictured above) corresponds to the imaginary line on which
21
text would sit. For items with no text it is the same as \e top.
22
23
The Qt Quick anchoring system allows you to define relationships between the anchor lines of different items. For example, you can write:
24
25
\code
26
Rectangle { id: rect1; ... }
27
Rectangle { id: rect2; anchors.left: rect1.right; ... }
28
\endcode
29
30
In this case, the left edge of \e rect2 is bound to the right edge of \e rect1, producing the following:
31
32
\image edge1.png
33
34
35
You can specify multiple anchors. For example:
36
37
\code
38
Rectangle { id: rect1; ... }
39
Rectangle { id: rect2; anchors.left: rect1.right; anchors.top: rect1.bottom; ... }
40
\endcode
41
42
\image edge3.png
43
44
By specifying multiple horizontal or vertical anchors you can control the size of an item. Below,
45
\e rect2 is anchored to the right of \e rect1 and the left of \e rect3. If either of the blue
46
rectangles are moved, \e rect2 will stretch and shrink as necessary:
47
48
\code
49
Rectangle { id: rect1; x: 0; ... }
50
Rectangle { id: rect2; anchors.left: rect1.right; anchors.right: rect3.left; ... }
51
Rectangle { id: rect3; x: 150; ... }
52
\endcode
53
54
\image edge4.png
55
56
There are also some convenience anchors. \c anchors.fill is a convenience that
57
is the same as setting the left, right, top, and bottom anchors to the
58
left, right, top and bottom of the target item. \c anchors.centerIn is another
59
convenience anchor, and is the same as setting the \c verticalCenter and
60
\c horizontalCenter anchors to the \c verticalCenter and \c horizontalCenter of
61
the target item.
62
63
\section1 Anchor Margins and Offsets
64
65
The anchoring system also allows \e margins and \e offsets to be specified for an item's anchors.
66
Margins specify the amount of empty space to leave to the outside of an item's anchor, while
67
offsets allow positioning to be manipulated using the center anchor lines. An item can
68
specify its anchor margins individually through \l {Item::anchors.leftMargin}{leftMargin},
69
\l {Item::anchors.rightMargin}{rightMargin}, \l {Item::anchors.topMargin}{topMargin} and
70
\l {Item::anchors.bottomMargin}{bottomMargin}, or use \l {Item::}{anchors.margins} to
71
specify the same margin value for all four edges. Anchor offsets are specified using
72
\l {Item::anchors.horizontalCenterOffset}{horizontalCenterOffset},
73
\l {Item::anchors.verticalCenterOffset}{verticalCenterOffset} and
74
\l {Item::anchors.baselineOffset}{baselineOffset}.
75
76
\image margins_qml.png
77
78
The following example specifies a left margin:
79
80
\code
81
Rectangle { id: rect1; ... }
82
Rectangle { id: rect2; anchors.left: rect1.right; anchors.leftMargin: 5; ... }
83
\endcode
84
85
In this case, a margin of 5 pixels is reserved to the left of \e rect2, producing the following:
86
87
\image edge2.png
88
89
\note Anchor margins only apply to anchors; they are \e not a generic means of applying margins to an \l Item.
90
If an anchor margin is specified for an edge but the item is not anchored to any item on that
91
edge, the margin is not applied.
92
93
\section1 Changing Anchors
94
95
Qt Quick provides the AnchorChanges type for specifying the anchors in a state.
96
97
\qml
98
State {
99
name: "anchorRight"
100
AnchorChanges {
101
target: rect2
102
anchors.right: parent.right
103
anchors.left: undefined //remove the left anchor
104
}
105
}
106
\endqml
107
108
AnchorChanges can be animated using the AnchorAnimation type.
109
110
\qml
111
Transition {
112
AnchorAnimation {} //animates any AnchorChanges in the corresponding state change
113
}
114
\endqml
115
116
Anchors can also be changed imperatively within JavaScript. However, these changes should be
117
carefully ordered, or they may produce unexpected outcomes. The following example illustrates the issue:
118
119
\table
120
\row
121
\li
122
\code
123
// May produce unexpected results
124
Rectangle {
125
width: 50
126
anchors.left: parent.left
127
128
function reanchorToRight() {
129
anchors.right = parent.right
130
anchors.left = undefined
131
}
132
}
133
\endcode
134
\li
135
\image anchor_ordering_bad.png
136
\endtable
137
138
139
When \c reanchorToRight is called, the function first sets the right anchor. At that point, both left
140
and right anchors are set, and the item will be stretched horizontally to fill its parent. When the left
141
anchor is unset, the new width will remain. Thus when updating anchors within JavaScript, you should
142
first unset any anchors that are no longer required, and only then set any new anchors that are required,
143
as shown below:
144
145
\table
146
\row
147
\li
148
\qml
149
// Correct code
150
Rectangle {
151
width: 50
152
anchors.left: parent.left
153
154
function reanchorToRight() {
155
anchors.left = undefined
156
anchors.right = parent.right
157
}
158
}
159
\endqml
160
\li
161
\image anchor_ordering.png
162
\endtable
163
164
Because the evaluation order of bindings is not defined, it is not recommended to change anchors via
165
conditional bindings, as this can lead to the ordering issue described above. In the following example
166
the \c Rectangle will eventually grow to the full width of its parent, because both left and right anchors
167
will be simultaneously set during binding update.
168
169
\code
170
// May produce unexpected results
171
Rectangle {
172
width: 50; height: 50
173
anchors.left: state == "right" ? undefined : parent.left;
174
anchors.right: state == "right" ? parent.right : undefined;
175
}
176
\endcode
177
178
This should be rewritten to use \l AnchorChanges instead, as \l AnchorChanges
179
will automatically handle ordering issues internally. Here's how to rewrite the
180
above example correctly:
181
182
\qml
183
// Correct code
184
Rectangle {
185
id: rect
186
width: 50; height: 50
187
anchors.left: parent.left // initial position
188
189
states: State {
190
name: "rightAligned"
191
AnchorChanges {
192
target: rect
193
anchors.left: undefined
194
anchors.right: parent.right
195
}
196
}
197
function toggleAnchoring() {
198
parent.state = (parent.state == "" ? "rightAligned" : "")
199
}
200
}
201
\endqml
202
203
\section1 Restrictions
204
205
For performance reasons, you can only anchor an item to its siblings and direct parent. For example,
206
the following anchor is invalid and would produce a warning:
207
208
\code
209
//bad code
210
Item {
211
id: group1
212
Rectangle { id: rect1; ... }
213
}
214
Item {
215
id: group2
216
Rectangle { id: rect2; anchors.left: rect1.right; ... } // invalid anchor!
217
}
218
\endcode
219
220
Also, anchor-based layouts cannot be mixed with absolute positioning. If an item specifies its
221
\l {Item::}{x} position and also sets \l {Item::}{anchors.left},
222
or anchors its left and right edges but additionally sets a \l {Item::}{width}, the
223
result is undefined, as it would not be clear whether the item should use anchoring or absolute
224
positioning. The same can be said for setting an item's \l {Item::}{y} and \l {Item::}{height}
225
with \l {Item::}{anchors.top} and \l {Item::}{anchors.bottom}, or setting \l {Item::}{anchors.fill}
226
as well as \l {Item::}{width} or \l {Item::}{height}. The same applies when using positioners
227
such as Row and Grid, which may set the item's \l {Item::}{x} and \l {Item::}{y} properties.
228
If you wish to change from using
229
anchor-based to absolute positioning, you can clear an anchor value by setting it to \c undefined.
230
231
*/
qtdeclarative
src
quick
doc
src
concepts
positioning
anchors.qdoc
Generated on
for Qt by
1.16.1