#include "clock.h" #include #include #include #include #include #include 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); }