基于Qt5实现精美电子表

基于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);
}

代码就分享到这里了,有兴趣的可以找我。大家一起进步!!下次再见

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值