Qt实现动态时钟表盘的设计

头文件

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>

#include <QPaintEvent>
#include <QDebug>

#include <QPainter>     //画家类

#include <QTime>    //时间类,显示时间使用
#include <QTimer>

#include <QMouseEvent>

QT_BEGIN_NAMESPACE
namespace Ui { class myWidget; }
QT_END_NAMESPACE

class myWidget : public QWidget
{
    Q_OBJECT

public:
    myWidget(QWidget *parent = nullptr);
    ~myWidget();

    //重写绘制事件处理函数【函数声明】
    void paintEvent(QPaintEvent *event) override;

private:
    Ui::myWidget *ui;

    //重定义鼠标按下时间,按下时,显示表盘指针【获取当前时间】
    void mousePressEvent(QMouseEvent *event) override;

    //定义一个整型变量【事件处理参数】【输出标签时使用】
    int t_id;

    //重写定时器事件处理函数
    void timerEvent(QTimerEvent *event) override;

    //定义一个定时器指针【计算初始时间时使用】
    QTimer *t;

};
#endif // MYWIDGET_H

源代码

#include "mywidget.h"
#include "ui_mywidget.h"

myWidget::myWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::myWidget)
{
    ui->setupUi(this);
}

myWidget::~myWidget()
{
    delete ui;

    //给定时器实例化对象空间【对象版】
    t = new QTimer(this);
    t->start(1000); //启动定时器,自动发射一个timeout信号,将此信号连接自定义的槽函数,每隔一定时间,系统会自动调用自定义的槽函数

    //QWidget类的 update()成员函数被调用时,窗口部件会收到绘制事件
    connect(t, SIGNAL(timeout()), this, SLOT(update()));  //连接信号槽,定时器超时触发窗体更新

}

//定义绘制事件的处理函数【重定义】
void myWidget::paintEvent(QPaintEvent *event)
{
    //实例化一个画家类
    QPainter p(this);

    //给画家设置画笔
    p.setPen(QColor(77,65,182));

    //给画家设置字体
    p.setFont(QFont("Consolas"));

    //绘制画家坐标起点
    p.translate(this->width()/2,this->height()/2);

    //绘制矢量文字
//    p.drawText(this->rect(), "Hello World");  //  绘制在最顶部
//    p.drawText(this->width()/2,this->height()/2,"LQS");     //此时使用的画笔临时坐标
//    p.drawText(QPoint(0, 0),"LQS");

    //画家的旋转角度
//    p.rotate(45);

    //填充颜色
    p.setBrush(QBrush(QColor(250,240,230)));     //表盘的背景色

    //画一个圆形
//    p.drawEllipse(0,0,200,100);
//    p.drawEllipse(QPoint(this->width()/2,this->height()/2),200,100);
    p.drawEllipse(QPoint(0, 0),200,200);

    //时刻表
    //给画家设置画笔
    p.setPen(QColor("black"));
    for(int i = 0; i < 60; i++)
    {
        //绘制小短线
        p.drawLine(200, 0,  190,0);
        p.rotate(6);
    }
    //小时时刻
    QPen pen;
    pen.setWidth(3);
    p.setPen(pen);
    for(int i = 1; i <= 12; i++)
    {
        p.rotate(30);
        //绘制小短线
        p.drawLine(0,200, 0,185);
        p.rotate(-2);
        p.drawText(0,-170,QString("%1").arg(i));
        p.rotate(2);
    }

    //获取当前时间
    QTime sysTime = QTime::currentTime();

    //将系统时间转换为字符串
    QString time_str = sysTime.toString();

    //字符串拆分出来
    int hh,mm,ss;
    QStringList list_time = time_str.split(":");
    hh = list_time[0].toUInt();
    mm = list_time[1].toUInt();
    ss = list_time[2].toUInt();
//    qDebug()<<"时间输出";
//    qDebug()<<hh;
//    qDebug()<<mm;
//    qDebug()<<ss;

    //秒针绘制
//    p.setPen(QPen(Qt::green, 2));
    p.setPen(QPen(QColor("green"), 2));
    p.rotate(ss*6);
    p.drawLine(QPoint(0,-190),QPoint(0,5));
    p.rotate(-(ss*6));

    //分针绘制
    p.setPen(QPen(QColor("blue"), 2));
    p.rotate(mm*6 + ss*6/60);
    p.drawLine(QPoint(0,-120),QPoint(0,5));
    p.rotate(-(mm*6 + ss*6/60));

    //时针绘制
    p.setPen(QPen(QColor("magenta"), 2));
    p.rotate(hh*30 + mm*6/12 + ss*6/60/12);
    p.drawLine(QPoint(0,-120),QPoint(0,5));
    p.rotate(-(hh*30 + mm*6/12 + ss*6/60/12));

    update();
}
void myWidget::mousePressEvent(QMouseEvent *event)
{
    //执行启动逻辑【按压鼠标,使用定时器】
    t_id = this->startTimer(1000);
}

//重写的定时器事件处理函数【上面的函数发送信号后,自动执行该程序】
void myWidget::timerEvent(QTimerEvent *event)
{
    //event表示已经超时的定时器
    //可以使用event的成员函数timeid来获取已经到位的定时器标识符
    if(event->timerId() == t_id)    //判断到达事件的id是否为我定义的id【判断是否为我的定时器】调用的函数都是timerEvent这一个
    {
        //日期事件
        //获取系统日期时间
        QDateTime sysDate = QDateTime::currentDateTime();

        //将日期时间转换为字符串
        QString date_str = sysDate.toString("yyyy-MM-dd hh:mm:ss");
        QString time_str = sysDate.toString("hh:mm:ss");

        //将字符串输出到ui界面
        ui->label_show->setText(date_str);
        QFont ft;
        ft.setPointSize(12);    //时间显示的大小
        ui->label_show->setFont(ft);
        //字符串拆分出来
        int hh,mm,ss;
        QStringList list_date = time_str.split(":");
        hh = list_date[0].toUInt();
        mm = list_date[1].toUInt();
        ss = list_date[2].toUInt();
//        qDebug()<<hh;
//        qDebug()<<mm;
//        qDebug()<<ss;
    }
}

运行结果

在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值