1 /****************************************************************************
3 ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/legal
6 ** This file is part of the documentation of the Qt Toolkit.
8 ** $QT_BEGIN_LICENSE:FDL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia. For licensing terms and
14 ** conditions see http://qt.digia.com/licensing. For further information
15 ** use the contact form at http://qt.digia.com/contact-us.
17 ** GNU Free Documentation License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Free
19 ** Documentation License version 1.3 as published by the Free Software
20 ** Foundation and appearing in the file included in the packaging of
21 ** this file. Please review the following information to ensure
22 ** the GNU Free Documentation License version 1.3 requirements
23 ** will be met: http://www.gnu.org/copyleft/fdl.html.
26 ****************************************************************************/
29 \page qtquick-positioning-anchors.html
30 \title Positioning with Anchors
31 \brief placing items with anchor properties
34 In addition to the more traditional \l Grid, \l Row, and \l Column,
35 Qt Quick also provides a way to layout items using the concept of \e anchors.
36 Each item can be thought of as having a set of 7 invisible "anchor lines":
37 \l {Item::anchors.left}{left}, \l {Item::anchors.horizontalCenter}{horizontalCenter},
38 \l {Item::anchors.right}{right}, \l {Item::anchors.top}{top},
39 \l {Item::anchors.verticalCenter}{verticalCenter}, \l {Item::anchors.baseline}{baseline},
40 and \l {Item::anchors.bottom}{bottom}.
44 The baseline (not pictured above) corresponds to the imaginary line on which
45 text would sit. For items with no text it is the same as \e top.
47 The Qt Quick anchoring system allows you to define relationships between the anchor lines of different items. For example, you can write:
50 Rectangle { id: rect1; ... }
51 Rectangle { id: rect2; anchors.left: rect1.right; ... }
54 In this case, the left edge of \e rect2 is bound to the right edge of \e rect1, producing the following:
59 You can specify multiple anchors. For example:
62 Rectangle { id: rect1; ... }
63 Rectangle { id: rect2; anchors.left: rect1.right; anchors.top: rect1.bottom; ... }
68 By specifying multiple horizontal or vertical anchors you can control the size of an item. Below,
69 \e rect2 is anchored to the right of \e rect1 and the left of \e rect3. If either of the blue
70 rectangles are moved, \e rect2 will stretch and shrink as necessary:
73 Rectangle { id: rect1; x: 0; ... }
74 Rectangle { id: rect2; anchors.left: rect1.right; anchors.right: rect3.left; ... }
75 Rectangle { id: rect3; x: 150; ... }
80 There are also some convenience anchors. anchors.fill is a convenience that is the same as setting the left,right,top and bottom anchors
81 to the left,right,top and bottom of the target item. anchors.centerIn is another convenience anchor, and is the same as setting the verticalCenter
82 and horizontalCenter anchors to the verticalCenter and horizontalCenter of the target item.
84 \section1 Anchor Margins and Offsets
86 The anchoring system also allows \e margins and \e offsets to be specified for an item's anchors.
87 Margins specify the amount of empty space to leave to the outside of an item's anchor, while
88 offsets allow positioning to be manipulated using the center anchor lines. An item can
89 specify its anchor margins individually through \l {Item::anchors.leftMargin}{leftMargin},
90 \l {Item::anchors.rightMargin}{rightMargin}, \l {Item::anchors.topMargin}{topMargin} and
91 \l {Item::anchors.bottomMargin}{bottomMargin}, or use \l {Item::}{anchors.margins} to
92 specify the same margin value for all four edges. Anchor offsets are specified using
93 \l {Item::anchors.horizontalCenterOffset}{horizontalCenterOffset},
94 \l {Item::anchors.verticalCenterOffset}{verticalCenterOffset} and
95 \l {Item::anchors.baselineOffset}{baselineOffset}.
97 \image margins_qml.png
99 The following example specifies a left margin:
102 Rectangle { id: rect1; ... }
103 Rectangle { id: rect2; anchors.left: rect1.right; anchors.leftMargin: 5; ... }
106 In this case, a margin of 5 pixels is reserved to the left of \e rect2, producing the following:
110 \note Anchor margins only apply to anchors; they are \e not a generic means of applying margins to an \l Item.
111 If an anchor margin is specified for an edge but the item is not anchored to any item on that
112 edge, the margin is not applied.
114 \section1 Changing Anchors
116 Qt Quick provides the AnchorChanges type for specifying the anchors in a state.
123 anchors.right: parent.right
124 anchors.left: undefined //remove the left anchor
129 AnchorChanges can be animated using the AnchorAnimation type.
133 AnchorAnimation {} //animates any AnchorChanges in the corresponding state change
137 Anchors can also be changed imperatively within JavaScript. However, these changes should be
138 carefully ordered, or they may produce unexpected outcomes. The following example illustrates the issue:
146 anchors.left: parent.left
148 function reanchorToRight() {
149 anchors.right = parent.right
150 anchors.left = undefined
155 \image anchor_ordering_bad.png
159 When \c reanchorToRight is called, the function first sets the right anchor. At that point, both left
160 and right anchors are set, and the item will be stretched horizontally to fill its parent. When the left
161 anchor is unset, the new width will remain. Thus when updating anchors within JavaScript, you should
162 first unset any anchors that are no longer required, and only then set any new anchors that are required,
171 anchors.left: parent.left
173 function reanchorToRight() {
174 anchors.left = undefined
175 anchors.right = parent.right
180 \image anchor_ordering.png
183 Because the evaluation order of bindings is not defined, it is not recommended to change anchors via
184 conditional bindings, as this can lead to the ordering issue described above. In the following example
185 the Rectangle will eventually grow to the full width of its parent, because both left and right anchors
186 will be simultaneously set during binding update.
190 width: 50; height: 50
191 anchors.left: state == "right" ? undefined : parent.left;
192 anchors.right: state == "right" ? parent.right : undefined;
196 This should be rewritten to use AnchorChanges instead, as AnchorChanges will automatically handle
197 ordering issues internally.
199 \section1 Restrictions
201 For performance reasons, you can only anchor an item to its siblings and direct parent. For example,
202 the following anchor is invalid and would produce a warning:
207 Rectangle { id: rect1; ... }
211 Rectangle { id: rect2; anchors.left: rect1.right; ... } // invalid anchor!
215 Also, anchor-based layouts cannot be mixed with absolute positioning. If an item specifies its
216 \l {Item::}{x} position and also sets \l {Item::}{anchors.left},
217 or anchors its left and right edges but additionally sets a \l {Item::}{width}, the
218 result is undefined, as it would not be clear whether the item should use anchoring or absolute
219 positioning. The same can be said for setting an item's \l {Item::}{y} and \l {Item::}{height}
220 with \l {Item::}{anchors.top} and \l {Item::}{anchors.bottom}, or setting \l {Item::}{anchors.fill}
221 as well as \l {Item::}{width} or \l {Item::}{height}. The same applies when using positioners
222 such as Row and Grid, which may set the item's \l {Item::}{x} and \l {Item::}{y} properties.
223 If you wish to change from using
224 anchor-based to absolute positioning, you can clear an anchor value by setting it to \c undefined.