Revision control

++ // Copyright (C) 2016 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
++
++ /*!
++ \example widgets/analogclock
++ \examplecategory {Graphics}
++ \meta tags {widgets}
++
++ \title Analog Clock
++ \ingroup examples-widgets
++ \brief The Analog Clock example shows how to draw the contents of a
++ custom widget.
++
++ \image analogclock-example.png
++ {Analog clock with hour, minute, and seconds hands}
++ \caption Screenshot of the Analog Clock example
++
++ This example also demonstrates how the transformation and scaling
++ features of QPainter can be used to make drawing custom widgets
++ easier.
++
++ \section1 AnalogClock Class Definition
++
++ The \c AnalogClock class provides a clock widget with hour, minute and
++ second hands that is automatically updated every second.
++ We subclass \l QWidget and reimplement the standard
++ \l{QWidget::paintEvent()}{paintEvent()} function to draw the clock face:
++
++ \snippet widgets/analogclock/analogclock.h 0
++
++ \section1 AnalogClock Class Implementation
++
++ When the widget is constructed, we set up a one-second timer to
++ keep track of the current time, and we connect it to the standard
++ \l{QWidget::update()}{update()} slot so that the clock face is
++ updated when the timer emits the \l{QTimer::timeout()}{timeout()}
++ signal. Finally, we resize the widget so that it is displayed at a
++ reasonable size.
++
++ \snippet widgets/analogclock/analogclock.cpp 1
++
++ The \c paintEvent() function is called whenever the widget's
++ contents need to be updated. This happens when the widget is
++ first shown, and when it is covered then exposed, but it is also
++ executed when the widget's \l{QWidget::update()}{update()} slot
++ is called. Since we connected the timer's
++ \l{QTimer::timeout()}{timeout()} signal to this slot, it will be
++ called at least once per second.
++
++ Before we set up the painter and draw the clock, we first define
++ three lists of \l {QPoint}s and three \l{QColor}s that will be used
++ for the hour, minute and second hands. We use the
++ \l{QWidget::palette()}{palette()} function to get appropriate colors
++ that fit into the rest of the window, both in light and dark mode.
++ The hour and minute hands are drawn in the foreground color, the
++ second hand is drawn in the accent color.
++
++ We also determine the length of the widget's shortest side so that we
++ can fit the clock face inside the widget. It is also useful to determine
++ the current time before we start drawing.
++
++ \snippet widgets/analogclock/analogclock.cpp 8
++ \snippet widgets/analogclock/analogclock.cpp 10
++
++ The contents of custom widgets are drawn with a QPainter.
++ Painters can be used to draw on any QPaintDevice, but they are
++ usually used with widgets, so we pass the widget instance to the
++ painter's constructor.
++
++ \snippet widgets/analogclock/analogclock.cpp 11
++ \snippet widgets/analogclock/analogclock.cpp 14
++
++ We call QPainter::setRenderHint() with QPainter::Antialiasing to
++ turn on antialiasing. This makes drawing of diagonal lines much
++ smoother.
++
++ \snippet widgets/analogclock/analogclock.cpp 12
++
++ The translation moves the origin to the center of the widget, and
++ the scale operation ensures that the following drawing operations
++ are scaled to fit within the widget. 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 widget's shortest
++ side.
++
++ \snippet widgets/analogclock/analogclock.cpp 13
++
++ 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 widget.
++
++ The painter takes care of all the transformations made during the
++ paint event, and ensures that everything is drawn correctly. Letting
++ the painter handle transformations is often easier than performing
++ manual calculations just to draw the contents of a custom widget.
++
++ \image analogclock-viewport.png
++ {Shows widget coordinate system and origin on clock face}
++
++ 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 widgets/analogclock/analogclock.cpp 15
++ \snippet widgets/analogclock/analogclock.cpp 16
++
++ 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.
++ We save and restore the transformation matrix before and after the rotation
++ by instantiating a QPainterStateGuard because we want to place the minute
++ hand without having to take into account any previous rotations.
++
++ \snippet widgets/analogclock/analogclock.cpp 19
++
++ We draw markers around the edge of the clock for each hour in the same
++ color as the hour hand. We draw each marker then rotate the coordinate
++ system so that the painter is ready for the next one.
++
++ \snippet widgets/analogclock/analogclock.cpp 20
++
++ The minute hand is rotated and painted in a similar way to the hour hand.
++
++ \snippet widgets/analogclock/analogclock.cpp 21
++
++ For the seconds hand we do the same and add two circles as a visual highlight.
++
++ \snippet widgets/analogclock/analogclock.cpp 23
++ \codeline
++ \snippet widgets/analogclock/analogclock.cpp 24
++
++ Finally, we draw markers around the edge of the clock, indicating
++ minutes and seconds. This time we draw them as lines and therefore
++ set the pen to the respective color.
++
++ \snippet widgets/analogclock/analogclock.cpp 25
++ \codeline
++ \snippet widgets/analogclock/analogclock.cpp 27
++
++ */