Analog Clock Example▲

This example also demonstrates how the transformation and scaling features of QPainter can be used to make drawing custom widgets easier.
AnalogClock Class Definition▲
The AnalogClock class provides a clock widget with hour and minute hands that is automatically updated every few seconds. We subclass QWidget and reimplement the standard paintEvent() function to draw the clock face:
class
AnalogClock : public
QWidget
{
Q_OBJECT
public
:
AnalogClock(QWidget *
parent =
0
);
protected
:
void
paintEvent(QPaintEvent *
event) override
;
}
;
AnalogClock Class Implementation▲
AnalogClock::
AnalogClock(QWidget *
parent)
:
QWidget(parent)
{
QTimer *
timer =
new
QTimer(this
);
connect(timer, SIGNAL(timeout()), this
, SLOT(update()));
timer-&
gt;start(1000
);
setWindowTitle(tr("Analog Clock"
));
resize(200
, 200
);
}
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 update() slot so that the clock face is updated when the timer emits the timeout() signal.
Finally, we resize the widget so that it is displayed at a reasonable size.
void
AnalogClock::
paintEvent(QPaintEvent *
)
{
static
const
QPoint hourHand[3
] =
{
QPoint(7
, 8
),
QPoint(-
7
, 8
),
QPoint(0
, -
40
)
}
;
static
const
QPoint minuteHand[3
] =
{
QPoint(7
, 8
),
QPoint(-
7
, 8
),
QPoint(0
, -
70
)
}
;
QColor hourColor(127
, 0
, 127
);
QColor minuteColor(0
, 127
, 127
, 191
);
int
side =
qMin(width(), height());
QTime time =
QTime::
currentTime();
The 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 update() slot is called. Since we connected the timer's timeout() signal to this slot, it will be called at least once every five seconds.
Before we set up the painter and draw the clock, we first define two lists of QPoints and two QColors 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.
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.
QPainter painter(this
);
painter.setRenderHint(QPainter::
Antialiasing);
painter.translate(width() /
2
, height() /
2
);
painter.scale(side /
200.0
, side /
200.0
);
The contents of custom widgets are drawn with a QPainter. Painters can be used to draw on any QPaintDevice, but they are usually used