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
|
/****************************************************************************
**
** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the documentation of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:FDL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia. For licensing terms and
** conditions see http://qt.digia.com/licensing. For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Free Documentation License Usage
** 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. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
** will be met: http://www.gnu.org/copyleft/fdl.html.
** $QT_END_LICENSE$
**
****************************************************************************/
/*!
\example analogclock
\title Analog Clock Window Example
\brief The Analog Clock Window example shows how to draw the contents of
a custom window.
\image analogclock-window-example.png Screenshot of the Analog
Clock Window example
This example demonstrates how the transformation and scaling
features of QPainter can be used to make drawing easier.
\section1 AnalogClockWindow Class Definition
The \c AnalogClockWindow class provides a clock with hour and
minute hands that is automatically updated every few seconds. We
make use of the RasterWindow from the \l {Raster Window Example}
and reimplement the \c render function to draw the clock face:
\snippet analogclock/main.cpp 5
\section1 AnalogClock Class Implementation
\snippet analogclock/main.cpp 6
We set a title on the window and resize to a reasonable size. Then
we start a timer which we will use to redraw the clock every
second.
\snippet analogclock/main.cpp 7
The timerEvent function is called every second as a result of
our startTimer call. Making use of the convenience in the base
class, we schedule the window to be repainted.
Checking the timer's id is not strictly needed as we only have
one active timer in this instance, but it is good practice to do
so.
\snippet analogclock/main.cpp 14
\snippet analogclock/main.cpp 8
Before we set up the painter and draw the clock, we first define
two lists of \l {QPoint}s and two \l{QColor}s that will be used
for the hour and minute hands. The minute hand's color has an
alpha component of 191, meaning that it's 75% opaque.
\snippet analogclock/main.cpp 9
We call QPainter::setRenderHint() with QPainter::Antialiasing to
turn on antialiasing. This makes drawing of diagonal lines much
smoother.
\snippet analogclock/main.cpp 10
The translation moves the origin to the center of the window, and
the scale operation ensures that the following drawing operations
are scaled to fit within the window. We use a scale factor that
let's us use x and y coordinates between -100 and 100, and that
ensures that these lie within the length of the window's shortest
side.
To make our code simpler, we will draw a fixed size clock face that will
be positioned and scaled so that it lies in the center of the window.
We also determine the length of the window's shortest side so that we
can fit the clock face inside the window.
The painter takes care of all the transformations made during the
rendering, and ensures that everything is drawn correctly. Letting
the painter handle transformations is often easier than performing
manual calculations.
\image analogclockwindow-viewport.png
We draw the hour hand first, using a formula that rotates the coordinate
system counterclockwise by a number of degrees determined by the current
hour and minute. This means that the hand will be shown rotated clockwise
by the required amount.
\snippet analogclock/main.cpp 11
We set the pen to be Qt::NoPen because we don't want any outline,
and we use a solid brush with the color appropriate for
displaying hours. Brushes are used when filling in polygons and
other geometric shapes.
\snippet analogclock/main.cpp 2
We save and restore the transformation matrix before and after the
rotation because we want to place the minute hand without having to
take into account any previous rotations.
\snippet analogclock/main.cpp 12
We draw markers around the edge of the clock for each hour. We
draw each marker then rotate the coordinate system so that the
painter is ready for the next one.
\snippet analogclock/main.cpp 13
\snippet analogclock/main.cpp 3
The minute hand is rotated in a similar way to the hour hand.
\snippet analogclock/main.cpp 4
Again, we draw markers around the edge of the clock, but this
time to indicate minutes. We skip multiples of 5 to avoid drawing
minute markers on top of hour markers.
*/
|