qt/LedOK/player/eleanaclock.cpp

83 lines
2.7 KiB
C++
Raw Normal View History

2023-04-18 14:14:46 +08:00
#include "eleanaclock.h"
#include <QJsonObject>
#include <QPainter>
EleAnaClock::EleAnaClock(double w, double h, QString path, const QJsonObject &layer, QWidget *parent) : QWidget{parent} {
timeZone = QTimeZone(layer["timezone"].toString().toUtf8());
img.load(path);
pinHourColor = layer["pinHourColor"].toString();
pinMinColor = layer["pinMinColor"].toString();
pinSecColor = layer["pinSecColor"].toString();
auto hhLen = layer["pinHourLen"].toInt();
auto mhLen = layer["pinMinLen"].toInt();
auto shLen = layer["pinSecLen"].toInt();
auto hhWidth = layer["pinHourWidth"].toInt();
auto mhWidth = layer["pinMinWidth"].toInt();
auto shWidth = layer["pinSecWidth"].toInt();
showSecHand = layer["showSecond"].toBool();
auto sideLen = w;
if(h < sideLen) sideLen = h;
auto lineWidth = sideLen/128;
if(lineWidth < 1) lineWidth = 1;
pen.setWidthF(lineWidth);
pen.setJoinStyle(Qt::RoundJoin);
hPoses[0].rx() = hhWidth*sideLen/400;
hPoses[1].ry() = hhLen*sideLen/-200;
hPoses[2].rx() = -hPoses[0].rx();
mPoses[0].rx() = mhWidth*sideLen/400;
mPoses[1].ry() = mhLen*sideLen/-200;
mPoses[2].rx() = -mPoses[0].rx();
sPoses[0].rx() = shWidth*sideLen/400;
sPoses[1].ry() = shLen*sideLen/-200;
sPoses[2].rx() = -sPoses[0].rx();
}
void EleAnaClock::cal() {
auto time = QDateTime::currentDateTime().toTimeZone(timeZone).time();
sAngle = time.second() * 6;
mAngle = time.minute() * 6 + sAngle/60;
hAngle = time.hour() * 30 + mAngle/12;
}
void EleAnaClock::paintEvent(QPaintEvent *) {
if(timerId==0) {
timerId = startTimer(500, 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);
pen.setColor(pinHourColor);
painter.setPen(pen);
painter.setBrush(pen.brush());
painter.rotate(hAngle);
painter.drawPolygon(hPoses, 3);
pen.setColor(pinMinColor);
painter.setPen(pen);
painter.setBrush(pen.brush());
painter.rotate(mAngle-hAngle);
painter.drawPolygon(mPoses, 3);
if(showSecHand) {
pen.setColor(pinSecColor);
painter.setPen(pen);
painter.setBrush(pen.brush());
painter.rotate(sAngle-mAngle);
painter.drawPolygon(sPoses, 3);
}
}
void EleAnaClock::timerEvent(QTimerEvent *) {
if(isVisible()) {
cal();
update();
} else if(timerId!=0) {
killTimer(timerId);
timerId = 0;
}
}