clock.cpp 2.08 KB
#include "clock.h"

#include <QPainter>
#include <QTime>
#include <QTimer>
#include <QtDebug>
#include <QPaintEvent>

Clock::Clock(QWidget *parent) : QWidget(parent)
{
    ticking = true;

    background.load(":/images/clock/numbers.png");

    QTimer *timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(checkUpdate()));
    timer->start(33);
}

void Clock::checkUpdate()
{
    if (ticking)
    {
        QTime cur = QTime::currentTime();
        if (cur.second() != last.second())
        {
            last = cur;
            update();
        }
    }
    else
        update();
}

void Clock::paintEvent(QPaintEvent */*event*/)
{
    QTime time = QTime::currentTime();

    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.drawImage(0, 0, background);
    painter.translate(width() / 2, height() / 2);

    int side = qMin(width(), height());
    painter.scale(side / 356.0, side / 355.0);

    QPen hourHand(Qt::white, 11, Qt::SolidLine, Qt::RoundCap);
    QPen hourArm(Qt::white, 4);

    QPen minHand(hourHand);
    QPen minArm(hourArm);

    QPen secHand(Qt::red, 3);

    QPen capPen(Qt::white, 4);
    QBrush capBrush(Qt::black, Qt::SolidPattern);

    // Needles
    qreal sec = time.second() + time.msec() / 1000.0;
    if (ticking)
        sec = time.second();

    qreal min = time.minute() + sec / 60.0;
    qreal hour = time.hour() + min / 60.0;

    // Sec
    painter.save();
    painter.rotate(6.0 * sec);
    painter.setPen(secHand);
    painter.drawLine(0, 28, 0, -155);
    painter.restore();

    // Min
    painter.save();
    painter.rotate(6.0 * min);
    painter.setPen(minArm);
    painter.drawLine(0, 0, 0, -30);
    painter.setPen(minHand);
    painter.drawLine(0, -27, 0, -125);
    painter.restore();

    // Hour
    painter.save();
    painter.rotate(30.0 * hour);
    painter.setPen(hourArm);
    painter.drawLine(0, 0, 0, -30);
    painter.setPen(hourHand);
    painter.drawLine(0, -27, 0, -80);
    painter.restore();

    // Cap
    painter.setPen(capPen);
    painter.setBrush(capBrush);
    painter.drawEllipse(-8, -8, 16, 16);
}