Initial import from the monolithic Qt.
[profile/ivi/qtdeclarative.git] / doc / src / declarative / tutorial.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-tutorial.html
30 \title QML Tutorial
31 \brief An introduction to the basic concepts and features of QML.
32 \nextpage QML Tutorial 1 - Basic Types
33
34 This tutorial gives an introduction to QML, the mark up language for Qt Quick. It doesn't cover everything;
35 the emphasis is on teaching the key principles, and features are introduced as needed.
36
37 Through the different steps of this tutorial we will learn about QML basic types, we will create our own QML component
38 with properties and signals, and we will create a simple animation with the help of states and transitions.
39
40 Chapter one starts with a minimal "Hello world" program and the following chapters introduce new concepts.
41
42 The tutorial's source code is located in the $QTDIR/examples/declarative/tutorials/helloworld directory.
43
44 Tutorial chapters:
45
46 \list 1
47 \o \l {QML Tutorial 1 - Basic Types}{Basic Types}
48 \o \l {QML Tutorial 2 - QML Components}{QML Components}
49 \o \l {QML Tutorial 3 - States and Transitions}{States and Transitions}
50 \endlist
51
52 */
53
54 /*!
55 \page qml-tutorial1.html
56 \title QML Tutorial 1 - Basic Types
57 \contentspage QML Tutorial
58 \previouspage QML Tutorial
59 \nextpage QML Tutorial 2 - QML Component
60
61 This first program is a very simple "Hello world" example that introduces some basic QML concepts.
62 The picture below is a screenshot of this program.
63
64 \image declarative-tutorial1.png
65
66 Here is the QML code for the application:
67
68 \snippet examples/declarative/tutorials/helloworld/tutorial1.qml 0
69
70 \section1 Walkthrough
71
72 \section2 Import
73
74 First, we need to import the types that we need for this example. Most QML files will import the built-in QML
75 types (like \l{Rectangle}, \l{Image}, ...) that come with Qt, using:
76
77 \snippet examples/declarative/tutorials/helloworld/tutorial1.qml 3
78
79 \section2 Rectangle element
80
81 \snippet examples/declarative/tutorials/helloworld/tutorial1.qml 1
82
83 We declare a root element of type \l{Rectangle}. It is one of the basic building blocks you can use to create an application in QML.
84 We give it an \c{id} to be able to refer to it later. In this case, we call it "page".
85 We also set the \c width, \c height and \c color properties.
86 The \l{Rectangle} element contains many other properties (such as \c x and \c y), but these are left at their default values.
87
88 \section2 Text element
89
90 \snippet examples/declarative/tutorials/helloworld/tutorial1.qml 2
91
92 We add a \l Text element as a child of the root Rectangle element that displays the text 'Hello world!'.
93
94 The \c y property is used to position the text vertically at 30 pixels from the top of its parent.
95
96 The \c anchors.horizontalCenter property refers to the horizontal center of an element.
97 In this case, we specify that our text element should be horizontally centered in the \e page element (see \l{anchor-layout}{Anchor-Based Layout}).
98
99 The \c font.pointSize and \c font.bold properties are related to fonts and use the \l{dot properties}{dot notation}.
100
101
102 \section2 Viewing the example
103
104 To view what you have created, run the \l{QML Viewer} tool (located in the \c bin directory) with your filename as the first argument.
105 For example, to run the provided completed Tutorial 1 example from the install location, you would type:
106
107 \code
108 bin/qmlviewer $QTDIR/examples/declarative/tutorials/helloworld/tutorial1.qml
109 \endcode
110 */
111
112 /*!
113 \page qml-tutorial2.html
114 \title QML Tutorial 2 - QML Components
115 \contentspage QML Tutorial
116 \previouspage QML Tutorial 1 - Basic Types
117 \nextpage QML Tutorial 3 - States and Transitions
118
119 This chapter adds a color picker to change the color of the text.
120
121 \image declarative-tutorial2.png
122
123 Our color picker is made of six cells with different colors.
124 To avoid writing the same code multiple times for each cell, we create a new \c Cell component.
125 A component provides a way of defining a new type that we can re-use in other QML files.
126 A QML component is like a black-box and interacts with the outside world through properties, signals and functions and is generally
127 defined in its own QML file. (For more details, see \l {Defining New Components}).
128 The component's filename must always start with a capital letter.
129
130 Here is the QML code for \c Cell.qml:
131
132 \snippet examples/declarative/tutorials/helloworld/Cell.qml 0
133
134 \section1 Walkthrough
135
136 \section2 The Cell Component
137
138 \snippet examples/declarative/tutorials/helloworld/Cell.qml 1
139
140 The root element of our component is an \l Item with the \c id \e container.
141 An \l Item is the most basic visual element in QML and is often used as a container for other elements.
142
143 \snippet examples/declarative/tutorials/helloworld/Cell.qml 4
144
145 We declare a \c cellColor property. This property is accessible from  \e outside our component, this allows us
146 to instantiate the cells with different colors.
147 This property is just an alias to an existing property - the color of the rectangle that compose the cell (see \l{Property Binding}).
148
149 \snippet examples/declarative/tutorials/helloworld/Cell.qml 5
150
151 We want our component to also have a signal that we call \e clicked with a \e cellColor parameter of type \e color.
152 We will use this signal to change the color of the text in the main QML file later.
153
154 \snippet examples/declarative/tutorials/helloworld/Cell.qml 2
155
156 Our cell component is basically a colored rectangle with the \c id \e rectangle.
157
158 The \c anchors.fill property is a convenient way to set the size of an element.
159 In this case the rectangle will have the same size as its parent (see \l{anchor-layout}{Anchor-Based Layout}).
160
161 \snippet examples/declarative/tutorials/helloworld/Cell.qml 3
162
163 In order to change the color of the text when clicking on a cell, we create a \l MouseArea element with
164 the same size as its parent.
165
166 A \l MouseArea defines a signal called \e clicked.
167 When this signal is triggered we want to emit our own \e clicked signal with the color as parameter.
168
169 \section2 The main QML file
170
171 In our main QML file, we use our \c Cell component to create the color picker:
172
173 \snippet examples/declarative/tutorials/helloworld/tutorial2.qml 0
174
175 We create the color picker by putting 6 cells with different colors in a grid.
176
177 \snippet examples/declarative/tutorials/helloworld/tutorial2.qml 1
178
179 When the \e clicked signal of our cell is triggered, we want to set the color of the text to the \e cellColor passed as a parameter.
180 We can react to any signal of our component through a property of the name \e 'onSignalName' (see \l{Signal Handlers}).
181 */
182
183 /*!
184 \page qml-tutorial3.html
185 \title QML Tutorial 3 - States and Transitions
186 \contentspage QML Tutorial
187 \previouspage QML Tutorial 2 - QML Component
188
189 In this chapter, we make this example a little bit more dynamic by introducing states and transitions.
190
191 We want our text to move to the bottom of the screen, rotate and become red when clicked.
192
193 \image declarative-tutorial3_animation.gif
194
195 Here is the QML code:
196
197 \snippet examples/declarative/tutorials/helloworld/tutorial3.qml 0
198
199 \section1 Walkthrough
200
201 \snippet examples/declarative/tutorials/helloworld/tutorial3.qml 2
202
203 First, we create a new \e down state for our text element.
204 This state will be activated when the \l MouseArea is pressed, and deactivated when it is released.
205
206 The \e down state includes a set of property changes from our implicit \e {default state}
207 (the items as they were initially defined in the QML).
208 Specifically, we set the \c y property of the text to \c 160, the rotation to \c 180 and the \c color to red.
209
210 \snippet examples/declarative/tutorials/helloworld/tutorial3.qml 3
211
212 Because we don't want the text to appear at the bottom instantly but rather move smoothly,
213 we add a transition between our two states.
214
215 \c from and \c to define the states between which the transition will run.
216 In this case, we want a transition from the default state to our \e down state.
217
218 Because we want the same transition to be run in reverse when changing back from the \e down state to the default state,
219 we set \c reversible to \c true.
220 This is equivalent to writing the two transitions separately.
221
222 The \l ParallelAnimation element makes sure that the two types of animations (number and color) start at the same time.
223 We could also run them one after the other by using \l SequentialAnimation instead.
224
225 For more details on states and transitions, see \l {QML States} and the \l{declarative/animation/states}{states and transitions example}.
226 */