基于Qt5实现精美电子表
好久没有写博文了,主要是最近工作有点忙。今天就来更新一下博文。
本文要实现的一个精美的电子时钟。
先看图
这个电子表的特别之处在于,每过一秒钟,时针,分针,秒针,刻度的颜色也会跟着变化,看到合适的颜色,点击一下左键即可颜色便会定下来。它不仅是一个电子表。它就像我们的人生一样。你可能不会知道下一刻会是什么样子,但只要坚持走下去,总会见到不一样的色彩,当你看到适合自己的,就要果断出手。
说了这么半天,再精美不也是用代码实现吗。接下来就上关键代码。
#include "analogclock.h"
#include <QTime>
#include <QDebug>
#include <QtMath>
#include <QFontMetrics>
#include <QPalette>
#include <QDate>
const double PI = 3.14;
AnalogClock::AnalogClock(QWidget *parent) : QWidget(parent)
{
setFixedSize(280,280);
bgColor = QColor(0,0,255,10);
minutePointerColor = QColor(Qt::blue);
secondPointerColor = QColor(Qt::green);
hourPointerColor = QColor(Qt::red);
scaleFont = QFont("Times New Roman",6);
scaleColor = QColor(0,0,255);
QLinearGradient linearGradient(QPoint(width()/2,0),QPoint(width()/2,height()));
startRenderColor = QColor(254,226,254);
endRenderColor = QColor(255,107,255);
linearGradient.setColorAt(0.0, startRenderColor);
linearGradient.setColorAt(1.0,endRenderColor);
bgBrush = QBrush(linearGradient);
QDate curDate = QDate::currentDate();
int days = workDate.daysTo(curDate);
dateTimeText = QDateTime::currentDateTime().toString("hh:mm:ss");
textFont = QFont("微软雅黑",4);
qDebug() << dateText;
textColor = QColor(Qt::blue);
isShowScaleValue = true;
isShowSecondPointer = true;
timer = new QTimer(this);
timer->start(1000);
connect(timer,&QTimer::timeout,[=](){this->update();});
}
void AnalogClock::paintEvent(QPaintEvent*)
{
int width = this->width();
int height = this->height();
int side = qMin(width,height);
//绘制准备工作 启动反锯齿 坐标平移 等比例缩放
QPainter painter(this);
painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
painter.translate(width / 2,height / 2);
painter.scale(side /200,side /200);
if(bgColor != Qt::transparent){
drawBg(&painter);
}
drawText(&painter);
//绘制刻度线
drawScale(&painter);
//绘制刻度值
if(isShowScaleValue){
drawScaleValue(&painter);
}
//绘制秒针
if(isShowSecondPointer) drawSecondPointer(&painter);
//绘制分针
drawMinutePointer(&painter);
//绘制时针
drawHourPointer(&painter);
}
void AnalogClock::drawBg(QPainter* painter)
{
painter->save();
painter->setPen(Qt::NoPen);
painter->setBrush(bgBrush==Qt::NoBrush?bgColor:bgBrush);
painter->drawRect(-width(),-height(),2*width(),2 * height());
painter->restore();
}
void AnalogClock::drawText(QPainter* painter)
{
painter->save();
painter->setFont(textFont);
QPen pen;
pen.setColor(textColor);
painter->setPen(pen);
dateTimeText = QDateTime::currentDateTime().toString("hh:mm:ss");
painter->drawText(-50,-80,100,100,Qt::AlignCenter,dateTimeText);
painter->restore();
}
void AnalogClock::drawScale(QPainter* painter)
{
int radius = 96;
painter->save();
painter->setBrush(Qt::NoBrush);
QPen pen;
pen.setColor(minutePointerColor);
painter->setPen(pen);
for(int i = 0; i < 60;i++){
if(i % 5 == 0){
pen.setWidth(8);
painter->drawLine(radius -10,0,radius,0);
}else{
pen.setWidth(3);
painter->drawLine(radius -4,0,radius,0);
}
painter->rotate(6);
}
painter->restore();
}
void AnalogClock::drawScaleValue(QPainter* painter)
{
int radius = 76;
painter->save();
double startRad = PI/3;
double deltaRad =PI/6;
painter->setBrush(Qt::NoBrush);
painter->setFont(scaleFont);
painter->setPen(scaleColor);
for(int i = 0;i <12;i++){
double sina = qSin(startRad - i*deltaRad);
double cosa = qCos(startRad - i*deltaRad);
QString strValue = QString::number(i+1);
double fontWidth = painter->fontMetrics().width(strValue);
double fontHeight = painter->fontMetrics().height();
int x = radius*cosa - fontWidth/2;
int y = -radius*sina + fontHeight/4;
painter->drawText(x,y,strValue);
}
painter->restore();
}
void AnalogClock::drawSecondPointer(QPainter* painter)
{
int radius = 80;
QTime time = QTime::currentTime();
painter->save();
painter->setPen(Qt::NoPen);
painter->setBrush(secondPointerColor);
QPolygon pts;
pts.setPoints(4,-1,0,0,5,1,0,0,-radius);
painter->rotate(6.0* time.second());
painter->drawConvexPolygon(pts);
painter->restore();
}
void AnalogClock::drawMinutePointer(QPainter* painter)
{
int radius = 70;
QTime time = QTime::currentTime();
painter->save();
painter->setPen(Qt::NoPen);
painter->setBrush(minutePointerColor);
QPolygon pts;
pts.setPoints(4,-2,0,0,5,2,0,0,-radius);
painter->rotate(6.0 * (time.minute() + time.second() / 60.0));
painter->drawConvexPolygon(pts);
painter->restore();
}
void AnalogClock::drawHourPointer(QPainter* painter)
{
int radius = 50;
QTime time = QTime::currentTime();
painter->save();
painter->setPen(Qt::NoPen);
painter->setBrush(hourPointerColor);
QPolygon pts;
pts.setPoints(4,-3,0,0,5,3,0,0,-radius);
painter->rotate(30.0 * ((time.hour() + time.minute() / 60.0)));
painter->drawConvexPolygon(pts);
painter->restore();
}
QSize AnalogClock::sizeHint() const
{
return QSize(200,200);
}
QSize AnalogClock::minimumSizeHint() const
{
return QSize(100,100);
}
代码就分享到这里了,有兴趣的可以找我。大家一起进步!!下次再见