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

#include <QTime>
#include <QPainter>
#include <QtDebug>
#include <QDateTime>
#include <QTimeZone>
#include <QTimer>

Clock::Clock(QWidget *parent) : QWidget(parent)
{
    QTimer *timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(update()));
    timer->start(33);
}

void Clock::paintEvent(QPaintEvent */*event*/)
{
    QTime time = QDateTime::currentDateTime().time();

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

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

    QPen hourHand(Qt::white, 6, Qt::SolidLine, Qt::RoundCap);
    QPen hourArm(Qt::white, 2);
    QPen hourLine(Qt::white, 3);

    QPen minHand(hourHand);
    QPen minArm(hourArm);
    QPen minLine(Qt::white, 1);

    QPen secHand(Qt::red, 2);

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

    QFont numberFont;
    numberFont.setPixelSize(20);

    QFontMetrics numberFontMetrics(numberFont);

    QPen numberPen(Qt::white);
    numberPen.setWidth(2);

    // Lines
    painter.setPen(minLine);
    for (int j = 0; j < 60; ++j) {
        if ((j % 5) != 0)
            painter.drawLine(92, 0, 96, 0);
        painter.rotate(6.0);
    }

    painter.setPen(hourLine);
    for (int i = 0; i < 12; ++i) {
//        painter.drawLine(88, 0, 96, 0);
        painter.drawLine(92, 0, 96, 0);
        painter.rotate(30.0);
    }

    // Numbers
    painter.setPen(numberPen);
    painter.setFont(numberFont);

    QTransform transform;
    QPoint targetPoint(0, -75);
    QPoint transformedTarget(targetPoint);

    QString strings[] = { "12", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11" };
    for (int i = 0; i < 12; i++) {
        QString string = strings[i];
        QRect boundingRect = numberFontMetrics.boundingRect(string);
        boundingRect.moveCenter(transformedTarget);
        painter.drawText(boundingRect, Qt::AlignCenter, string);

        transform.rotate(30.0);
        transformedTarget = transform.map(targetPoint);
    }

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

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

    // Sec
    painter.save();
    painter.setPen(secHand);
    painter.rotate(6.0 * second);
    painter.drawLine(0, 15, 0, -80);
    painter.restore();

    // Min
    painter.save();
    painter.rotate(6.0 * minute);
    painter.setPen(minArm);
    painter.drawLine(0, 0, 0, -15);
    painter.setPen(minHand);
    painter.drawLine(0, -15, 0, -75);
    painter.restore();

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

    // Cap
    painter.setPen(capPen);
    painter.setBrush(capBrush);
    painter.drawEllipse(-5, -5, 10, 10);
}