qt/LedOK/player/eleanaclock.cpp

75 lines
2.3 KiB
C++
Raw Normal View History

2022-01-20 10:08:17 +08:00
#include "eleanaclock.h"
#include <QJsonObject>
#include <QPainter>
2022-08-25 18:37:24 +08:00
#include <QtMath>
2022-01-20 10:08:17 +08:00
2022-08-25 18:37:24 +08:00
EleAnaClock::EleAnaClock(QString path, const QJsonObject &layer, QWidget *parent) : QWidget{parent} {
2022-01-20 10:08:17 +08:00
timeZone = QTimeZone(layer["timezone"].toString().toUtf8());
img.load(path);
pinHourColor = layer["pinHourColor"].toString();
pinMinColor = layer["pinMinColor"].toString();
pinSecColor = layer["pinSecColor"].toString();
}
void EleAnaClock::cal() {
QTime time = QDateTime::currentDateTime().toTimeZone(timeZone).time();
double rad = time.second()*M_PI/30;
double rsin = sin(rad);
double rcos = cos(rad);
double sideLen = width();
if(height() < sideLen) sideLen = height();
sPath = QPainterPath(QPointF(sideLen*0.55*rsin, sideLen*-0.55*rcos));
double pinWidth = sideLen/36;
double sx = pinWidth*rcos;
double sy = pinWidth*rsin;
sPath.lineTo(sx, sy);
sPath.lineTo(-sx, -sy);
sPath.closeSubpath();
rad = time.minute()*M_PI/30 + rad/60;
rsin = sin(rad);
rcos = cos(rad);
mPath = QPainterPath(QPointF(sideLen*0.45*rsin, sideLen*-0.45*rcos));
pinWidth = sideLen/30;
sx = pinWidth*rcos;
sy = pinWidth*rsin;
mPath.lineTo(sx, sy);
mPath.lineTo(-sx, -sy);
mPath.closeSubpath();
rad = time.hour()*M_PI/6 + rad/12;
rsin = sin(rad);
rcos = cos(rad);
hPath = QPainterPath(QPointF(sideLen*0.3*rsin, sideLen*-0.3*rcos));
pinWidth = sideLen/18;
sx = pinWidth*rcos;
sy = pinWidth*rsin;
hPath.lineTo(sx, sy);
hPath.lineTo(-sx, -sy);
hPath.closeSubpath();
}
void EleAnaClock::paintEvent(QPaintEvent *) {
if(timerId==0) {
timerId = startTimer(1000, Qt::PreciseTimer);
cal();
}
QPainter painter(this);
painter.setRenderHints(QPainter::Antialiasing|QPainter::SmoothPixmapTransform);
if(! img.isNull()) painter.drawPixmap(0, 0, width(), height(), img);
painter.translate(width()/2, height()/2);
painter.fillPath(hPath, QBrush(pinHourColor));
painter.fillPath(mPath, QBrush(pinMinColor));
painter.fillPath(sPath, QBrush(pinSecColor));
painter.translate(-width()/2, -height()/2);
}
void EleAnaClock::timerEvent(QTimerEvent *) {
if(isVisible()) {
cal();
repaint();
} else if(timerId!=0) {
killTimer(timerId);
timerId = 0;
}
}