Initial import from the monolithic Qt.
[profile/ivi/qtdeclarative.git] / doc / src / declarative / anchor-layout.qdoc
1 /****************************************************************************
2 **
3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
6 **
7 ** This file is part of the documentation of the Qt Toolkit.
8 **
9 ** $QT_BEGIN_LICENSE:FDL$
10 ** No Commercial Usage
11 ** This file contains pre-release code and may not be distributed.
12 ** You may use this file in accordance with the terms and conditions
13 ** contained in the Technology Preview License Agreement accompanying
14 ** this package.
15 **
16 ** GNU Free Documentation License
17 ** Alternatively, this file may be used under the terms of the GNU Free
18 ** Documentation License version 1.3 as published by the Free Software
19 ** Foundation and appearing in the file included in the packaging of this
20 ** file.
21 **
22 ** If you have questions regarding the use of this file, please contact
23 ** Nokia at qt-info@nokia.com.
24 ** $QT_END_LICENSE$
25 **
26 ****************************************************************************/
27
28 /*!
29 \page qml-anchor-layout.html
30 \target anchor-layout
31 \contentspage QML Features
32 \previouspage {Using QML Positioner and Repeater Items}{Component Layouts}
33 \nextpage {QML Mouse Events}{Mouse Events}
34 \title Anchor-based Layout in QML
35
36 In addition to the more traditional \l Grid, \l Row, and \l Column,
37 QML also provides a way to layout items using the concept of \e anchors.
38 Each item can be thought of as having a set of 7 invisible "anchor lines":
39 \l {Item::anchors.left}{left}, \l {Item::anchors.horizontalCenter}{horizontalCenter},
40 \l {Item::anchors.right}{right}, \l {Item::anchors.top}{top},
41 \l {Item::anchors.verticalCenter}{verticalCenter}, \l {Item::anchors.baseline}{baseline},
42 and \l {Item::anchors.bottom}{bottom}.
43
44 \image edges_qml.png
45
46 The baseline (not pictured above) corresponds to the imaginary line on which
47 text would sit. For items with no text it is the same as \e top.
48
49 The QML anchoring system allows you to define relationships between the anchor lines of different items. For example, you can write:
50
51 \code
52 Rectangle { id: rect1; ... }
53 Rectangle { id: rect2; anchors.left: rect1.right; ... }
54 \endcode
55
56 In this case, the left edge of \e rect2 is bound to the right edge of \e rect1, producing the following:
57
58 \image edge1.png
59
60
61 You can specify multiple anchors. For example:
62
63 \code
64 Rectangle { id: rect1; ... }
65 Rectangle { id: rect2; anchors.left: rect1.right; anchors.top: rect1.bottom; ... }
66 \endcode
67
68 \image edge3.png
69
70 By specifying multiple horizontal or vertical anchors you can control the size of an item. Below,
71 \e rect2 is anchored to the right of \e rect1 and the left of \e rect3. If either of the blue
72 rectangles are moved, \e rect2 will stretch and shrink as necessary:
73
74 \code
75 Rectangle { id: rect1; x: 0; ... }
76 Rectangle { id: rect2; anchors.left: rect1.right; anchors.right: rect3.left; ... }
77 Rectangle { id: rect3; x: 150; ... }
78 \endcode
79
80 \image edge4.png
81
82 There are also some convenience anchors. anchors.fill is a convenience that is the same as setting the left,right,top and bottom anchors
83 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
84 and horizontalCenter anchors to the verticalCenter and horizontalCenter of the target item.
85
86 \section1 Anchor Margins and Offsets
87
88 The anchoring system also allows \e margins and \e offsets to be specified for an item's anchors.
89 Margins specify the amount of empty space to leave to the outside of an item's anchor, while
90 offsets allow positioning to be manipulated using the center anchor lines.  An item can
91 specify its anchor margins individually through \l {Item::anchors.leftMargin}{leftMargin},
92 \l {Item::anchors.rightMargin}{rightMargin}, \l {Item::anchors.topMargin}{topMargin} and
93 \l {Item::anchors.bottomMargin}{bottomMargin}, or use \l {Item::}{anchors.margins} to
94 specify the same margin value for all four edges. Anchor offsets are specified using
95 \l {Item::anchors.horizontalCenterOffset}{horizontalCenterOffset},
96 \l {Item::anchors.verticalCenterOffset}{verticalCenterOffset} and
97 \l {Item::anchors.baselineOffset}{baselineOffset}.
98
99 \image margins_qml.png
100
101 The following example specifies a left margin:
102
103 \code
104 Rectangle { id: rect1; ... }
105 Rectangle { id: rect2; anchors.left: rect1.right; anchors.leftMargin: 5; ... }
106 \endcode
107
108 In this case, a margin of 5 pixels is reserved to the left of \e rect2, producing the following:
109
110 \image edge2.png
111
112 \note Anchor margins only apply to anchors; they are \e not a generic means of applying margins to an \l Item.
113 If an anchor margin is specified for an edge but the item is not anchored to any item on that
114 edge, the margin is not applied.
115
116
117 \section1 Restrictions
118
119 For performance reasons, you can only anchor an item to its siblings and direct parent. For example,
120 the following anchor is invalid and would produce a warning:
121
122 \badcode
123 Item {
124     id: group1
125     Rectangle { id: rect1; ... }
126 }
127 Item {
128     id: group2
129     Rectangle { id: rect2; anchors.left: rect1.right; ... }    // invalid anchor!
130 }
131 \endcode
132
133 Also, anchor-based layouts cannot be mixed with absolute positioning. If an item specifies its
134 \l {Item::}{x} position and also sets \l {Item::}{anchors.left},
135 or anchors its left and right edges but additionally sets a \l {Item::}{width}, the
136 result is undefined, as it would not be clear whether the item should use anchoring or absolute
137 positioning. The same can be said for setting an item's \l {Item::}{y} and \l {Item::}{height}
138 with \l {Item::}{anchors.top} and \l {Item::}{anchors.bottom}, or setting \l {Item::}{anchors.fill}
139 as well as \l {Item::}{width} or \l {Item::}{height}. If you wish to change from using
140 anchor-based to absolute positioning, you can clear an anchor value by setting it to \c undefined.
141
142 */