summaryrefslogtreecommitdiffstats
path: root/doc/src/examples/wheel.qdoc
blob: 995ff87391c2c90b2056dca4d359651c568ee6c0 (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
/****************************************************************************
**
** Copyright (C) 2011 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:FDL$
** 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 Free Documentation License
** Alternatively, this file may be used under the terms of the GNU Free
** Documentation License version 1.3 as published by the Free Software
** Foundation and appearing in the file included in the packaging of this
** file.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
** $QT_END_LICENSE$
**
****************************************************************************/

/*!
    \example scroller/wheel
    \title Wheel Scroller Example

    The Wheel Scroller Example shows how to use QScroller, QScrollEvent
    and QScrollPrepareEvent to implement smooth scrolling for a
    custom Widget.

    \section1 Basics

    The QScroller class is the main part of the smooth scrolling
    mechanism in Qt. It keeps track of the current scroll position and
    speed and updates the object through events.
    QScroller will get touch events via the QFlickGesture.
    It will query the target object through a QScrollPrepareEvent for
    the scroll area and other information.
    QScroller will send QScrollEvents to inform the target object about
    the current scroll position.
    The target object (usually a QWidget or a QGraphicsObject) will
    then need to update it's graphical representation to reflect the
    new scroll position.

    \section1 The Wheel Widget class

    To demonstrate how to use the QScroller we implement a QWidget that
    looks and works like the wheel of a slot machine.
    The wheel can be started via touch events and will continue getting
    slower.
    Additionally the wheel should appear as if no border exists (which
    would seem unnatural) and the scrolling should snap to center one
    item.

    In the widget we need to grab the QFlickGesture. The gesture itself
    will setAcceptTouchEvents for us, so we don't need to do that here.

    \snippet examples/scroller/wheel/wheelwidget.cpp 0

    The widget will get gesture events but in addition we also will
    get the events from QScroller.
    We will need to accept the QScrollPrepareEvent to indicate that
    a scrolling should really be started from the given position.

    \snippet examples/scroller/wheel/wheelwidget.cpp 1

    We should call all three set functions form QScrollPrepareEvent.

    \list
    \o \c setViewportSize to indicate our viewport size. Actually the
     given code could be improved by giving our size minus the borders.
    \o \c setMaxContentPos to indicate the maximum values for the scroll
     position. The minimum values are implicitely set to 0.
     In our example we give a very high number here and hope that the user
     is not patient enough to scroll until the very end.
    \o \c setContentPos to indicate the current scroll position.
     We give a position in the middle of the huge scroll area.
     Actually we give this position every time a new scroll is started so
     the user will only reach the end if he continuously scrolls in one
     direction which is not very likely.
    \endlist

    The handling of the QScrollEvent is a lengthly code not fully shown here.
    \snippet examples/scroller/wheel/wheelwidget.cpp 2

    In principle it does three steps.
    \list
    \o It calculates and updates the current scroll position as given by
     QScroller.
    \o It repaints the widget so that the new position is shown.
    \o It centers the item as soon as the scrolling stopps.
    \endlist

    The following code does the centering.
    \snippet examples/scroller/wheel/wheelwidget.cpp 3

    We check if the scrolling is finished which is indicated in the
    QScrollEvent by the \c isLast flag.
    We then check if the item is not already centered and if not start a new
    scroll by calling QScroller::scrollTo.

    As you can see the QScroller can be used for other things besides simple
    scroll areas.
*/