summaryrefslogtreecommitdiffstats
path: root/doc/src/declarative/tutorial.qdoc
blob: 66de741792ec3d82860b68261db9e3ca4c82724c (plain)
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
/****************************************************************************
**
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the documentation of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** No Commercial Usage
** This file contains pre-release code and may not be distributed.
** You may use this file in accordance with the terms and conditions
** contained in the Technology Preview License Agreement accompanying
** this package.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file.  Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights.  These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
**
**
**
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/

/*!
\page qml-tutorial.html
\title QML Tutorial
\brief An introduction to the basic concepts and features of QML.
\nextpage QML Tutorial 1 - Basic Types

This tutorial gives an introduction to QML, the mark up language for Qt Quick. It doesn't cover everything;
the emphasis is on teaching the key principles, and features are introduced as needed.

Through the different steps of this tutorial we will learn about QML basic types, we will create our own QML component
with properties and signals, and we will create a simple animation with the help of states and transitions.

Chapter one starts with a minimal "Hello world" program and the following chapters introduce new concepts.

The tutorial's source code is located in the $QTDIR/examples/declarative/tutorials/helloworld directory.

Tutorial chapters:

\list
\o \l {QML Tutorial 1 - Basic Types}
\o \l {QML Tutorial 2 - QML Component}
\o \l {QML Tutorial 3 - States and Transitions}
\endlist

*/

/*!
\page qml-tutorial1.html
\title QML Tutorial 1 - Basic Types
\contentspage QML Tutorial
\previouspage QML Tutorial
\nextpage QML Tutorial 2 - QML Component

This first program is a very simple "Hello world" example that introduces some basic QML concepts.
The picture below is a screenshot of this program.

\image declarative-tutorial1.png

Here is the QML code for the application:

\snippet examples/declarative/tutorials/helloworld/tutorial1.qml 0

\section1 Walkthrough

\section2 Import

First, we need to import the types that we need for this example. Most QML files will import the built-in QML
types (like \l{Rectangle}, \l{Image}, ...) that come with Qt with:

\snippet examples/declarative/tutorials/helloworld/tutorial1.qml 3

\section2 Rectangle element

\snippet examples/declarative/tutorials/helloworld/tutorial1.qml 1

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.
We give it an \c{id} to be able to refer to it later. In this case, we call it \e page.
We also set the \c width, \c height and \c color properties.
The \l{Rectangle} element contains many other properties (such as \c x and \c y), but these are left at their default values.

\section2 Text element

\snippet examples/declarative/tutorials/helloworld/tutorial1.qml 2

We add a \l Text element as a child of our root element that will display the text 'Hello world!'.

The \c y property is used to position the text vertically at 30 pixels from the top of its parent.

The \c font.pointSize and \c font.bold properties are related to fonts and use the \l{dot properties}{dot notation}.

The \c anchors.horizontalCenter property refers to the horizontal center of an element.
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}).

\section2 Viewing the example

To view what you have created, run the \l{Qt Declarative UI Runtime}{qml} tool (located in the \c bin directory) with your filename as the first argument.
For example, to run the provided completed Tutorial 1 example from the install location, you would type:

\code
bin/qml $QTDIR/examples/declarative/tutorials/helloworld/tutorial1.qml
\endcode
*/

/*!
\page qml-tutorial2.html
\title QML Tutorial 2 - QML Component
\contentspage QML Tutorial
\previouspage QML Tutorial 1 - Basic Types
\nextpage QML Tutorial 3 - States and Transitions

This chapter adds a color picker to change the color of the text.

\image declarative-tutorial2.png

Our color picker is made of six cells with different colors.
To avoid writing the same code multiple times, we first create a new \c Cell component.
A component provides a way of defining a new type that we can re-use in other QML files.
A QML component is like a black-box and interacts with the outside world through properties, signals and slots and is generally
defined in its own QML file (for more details, see \l {Defining new Components}).
The component's filename must always start with a capital letter.

Here is the QML code for \c Cell.qml:

\snippet examples/declarative/tutorials/helloworld/Cell.qml 0

\section1 Walkthrough

\section2 The Cell Component

\snippet examples/declarative/tutorials/helloworld/Cell.qml 1

The root element of our component is an \l Item with the \c id \e container.
An \l Item is the most basic visual element in QML and is often used as a container for other elements.

\snippet examples/declarative/tutorials/helloworld/Cell.qml 4

We declare a \c color property. This property is accessible from  \e outside our component, this allows us
to instantiate the cells with different colors.
This property is just an alias to an existing property - the color of the rectangle that compose the cell (see \l{intro-properties}{Properties}).

\snippet examples/declarative/tutorials/helloworld/Cell.qml 5

We want our component to also have a signal that we call \e clicked with a \e color parameter.
We will use this signal to change the color of the text in the main QML file later.

\snippet examples/declarative/tutorials/helloworld/Cell.qml 2

Our cell component is basically a colored rectangle with the \c id \e rectangle.

The \c anchors.fill property is a convenient way to set the size of an element.
In this case the rectangle will have the same size as its parent (see \l{anchor-layout}{Anchor-based Layout}).

\snippet examples/declarative/tutorials/helloworld/Cell.qml 3

In order to change the color of the text when clicking on a cell, we create a \l MouseArea element with
the same size as its parent.

A \l MouseArea defines a signal called \e clicked.
When this signal is triggered we want to emit our own \e clicked signal with the color as parameter.

\section2 The main QML file

In our main QML file, we use our \c Cell component to create the color picker:

\snippet examples/declarative/tutorials/helloworld/tutorial2.qml 0

We create the color picker by putting 6 cells with different colors in a grid.

\snippet examples/declarative/tutorials/helloworld/tutorial2.qml 1

When the \e clicked signal of our cell is triggered, we want to set the color of the text to the color passed as a parameter.
We can react to any signal of our component through a property of the name \e 'onSignalName' (see \l{Signal Handlers}).
*/

/*!
\page qml-tutorial3.html
\title QML Tutorial 3 - States and Transitions
\contentspage QML Tutorial
\previouspage QML Tutorial 2 - QML Component

In this chapter, we make this example a little bit more dynamic by introducing states and transitions.

We want our text to move to the bottom of the screen, rotate and become red when clicked.

\image declarative-tutorial3_animation.gif

Here is the QML code:

\snippet examples/declarative/tutorials/helloworld/tutorial3.qml 0

\section1 Walkthrough

\snippet examples/declarative/tutorials/helloworld/tutorial3.qml 2

First, we create a new \e down state for our text element.
This state will be activated when the \l MouseArea is pressed, and deactivated when it is released.

The \e down state includes a set of property changes from our implicit \e {default state}
(the items as they were initially defined in the QML).
Specifically, we set the \c y property of the text to \c 160, the rotation to \c 180 and the \c color to red.

\snippet examples/declarative/tutorials/helloworld/tutorial3.qml 3

Because we don't want the text to appear at the bottom instantly but rather move smoothly,
we add a transition between our two states.

\c from and \c to define the states between which the transition will run.
In this case, we want a transition from the default state to our \e down state.

Because we want the same transition to be run in reverse when changing back from the \e down state to the default state,
we set \c reversible to \c true.
This is equivalent to writing the two transitions separately.

The \l ParallelAnimation element makes sure that the two types of animations (number and color) start at the same time.
We could also run them one after the other by using \l SequentialAnimation instead.

For more details on states and transitions, see \l {QML States}.
*/