Qt时钟与秒表

目录

一、项目展示

二、UI界面布局

1、时钟UI界面

2、计时器UI界面

三、核心代码

1、生成时钟表盘

2、页面跳转

3、实现计时器功能

4、例程代码

时钟核心代码

定时器核心代码


一、项目展示

时钟与计时器

二、UI界面布局

1、时钟UI界面

2、计时器UI界面

三、核心代码

1、生成时钟表盘

需要用到Qt绘图自定义控件

先获取当前时间

timer = startTimer(1000);
    QTime nowtime = QTime::currentTime();
    h = nowtime.hour();
    m = nowtime.minute();
    s = nowtime.second();

 再完成时间功能与绘图自定义控件

void Widget::timerEvent(QTimerEvent *event)
{
    s++;
    if (s == 60)
       {
           s = 0;
           m++;

           if (m == 60)
           {
               m = 0;
               h++;

               if (h == 24)
               {
                   h = 0;
               }
           }
       }
}
void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);  //必须在绘图事件中定义才会被激活
    painter.setRenderHint(QPainter::Antialiasing,true);  //消除锯齿
    QPen mypen(Qt::black,3);  //构建一只画笔mypen
    painter.setPen(mypen);   //使用画笔
    QPoint center(this->width()/2,this->height()/2);   //定点到画布的中心位置
    painter.translate(center);     //利用translate函数将原点定位到中心位置
    QPoint cen(0,0);
    //painter.drawEllipse(cen,200,200);   //绘制时钟的外围

    //绘制小时的刻度线
    for(int i=0;i<12;i++)
    {
        painter.rotate(30);
        painter.drawLine(0,-180,0,-200);
    }

   //绘制分钟的刻度线
    for(int i=0;i<60;i++)
    {
        painter.rotate(6);
        painter.drawLine(0,-190,0,-200);
    }
    painter.end();

    QPainter painters(this);  //定义一个画家来控制秒针
    painters.setRenderHint(QPainter::Antialiasing,true);
    mypen.setWidth(1);
    mypen.setColor(Qt::red);
    painters.setPen(mypen);
    painters.translate(center);
    painters.rotate(s*6);  //秒针每次转6°
    painters.drawLine(0,0,0,-150);  //画出秒针
    painters.end();

    QPainter painterm(this);  //定义一个画家来控制分针
    painterm.setRenderHint(QPainter::Antialiasing,true);
    mypen.setWidth(4);
    mypen.setColor(Qt::blue);
    painterm.setPen(mypen);
    painterm.translate(center);
    painterm.rotate(m*6);  //分针每次转6°(一小格)
    painterm.drawLine(0,0,0,-150);
    painterm.end();

    QPainter painterh(this);  //定义一个画家来控制时针
    painterh.setRenderHint(QPainter::Antialiasing,true);
    mypen.setWidth(7);
    mypen.setColor(Qt::green);
    painterh.setPen(mypen);
    painterh.translate(center);
    painterh.rotate(h*30+m*0.5);  //时针每小时偏移30°并在原来的基础上每分钟偏移0.5°
    painterh.drawLine(0,0,0,-100);
    painterh.end();

    update();  //刷新绘图事件
}

2、页面跳转

UI界面的跳转经过测试需要加一个阻塞式延时,使跳转界面更加稳定。

    miaobiao *miaobiao1 = new miaobiao;
    //页面跳转
    miaobiao1->setGeometry(this->geometry());
    miaobiao1->show();
    //关闭时钟界面
    QThread::msleep(50);
    this->close();
void miaobiao::on_btn_clock_clicked()
{
    Widget *shizhong = new Widget;
    //页面跳转
    shizhong->setGeometry(this->geometry());
    shizhong->show();
    //关闭秒表界面
    QThread::msleep(50);
    this->close();
}

3、实现计时器功能

信号 timeout 与槽函数绑定
connect(&timer2,SIGNAL(timeout()),this,SLOT(timeOut_Slot()));

开始定时

void miaobiao::on_btn_start_clicked()
{
    timer2.start(3);
}

 停止定时

void miaobiao::on_btn_close_clicked()
{
    timer2.stop();
    i = 0;
}

重置定时器

//重置计时器
void miaobiao::on_btn_restart_clicked()
{
    timer2.stop();
    time2.setHMS(0,0,0,0);
    ui->time->setText("00:00:00:000");
    ui->jilu->clear();
    i = 0;
}

 将定时时间显示

void miaobiao::timeOut_Slot()
{
    time2 = time2.addMSecs(3);
    ui->time->setText(time2.toString("hh:mm:ss.zzz"));
}

4、例程代码

时钟核心代码

#include "widget.h"
#include "ui_widget.h"
#include <QTime>
#include <QPainter>
#include "miaobiao.h"
#include <QThread>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    timer = startTimer(1000);
    QTime nowtime = QTime::currentTime();
    h = nowtime.hour();
    m = nowtime.minute();
    s = nowtime.second();

}

Widget::~Widget()
{
    delete ui;
}

void Widget::timerEvent(QTimerEvent *event)
{
    s++;
    if (s == 60)
       {
           s = 0;
           m++;

           if (m == 60)
           {
               m = 0;
               h++;

               if (h == 24)
               {
                   h = 0;
               }
           }
       }
}
void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);  //必须在绘图事件中定义才会被激活
    painter.setRenderHint(QPainter::Antialiasing,true);  //消除锯齿
    QPen mypen(Qt::black,3);  //构建一只画笔mypen
    painter.setPen(mypen);   //使用画笔
    QPoint center(this->width()/2,this->height()/2);   //定点到画布的中心位置
    painter.translate(center);     //利用translate函数将原点定位到中心位置
    QPoint cen(0,0);
    //painter.drawEllipse(cen,200,200);   //绘制时钟的外围

    //绘制小时的刻度线
    for(int i=0;i<12;i++)
    {
        painter.rotate(30);
        painter.drawLine(0,-180,0,-200);
    }

   //绘制分钟的刻度线
    for(int i=0;i<60;i++)
    {
        painter.rotate(6);
        painter.drawLine(0,-190,0,-200);
    }
    painter.end();

    QPainter painters(this);  //定义一个画家来控制秒针
    painters.setRenderHint(QPainter::Antialiasing,true);
    mypen.setWidth(1);
    mypen.setColor(Qt::red);
    painters.setPen(mypen);
    painters.translate(center);
    painters.rotate(s*6);  //秒针每次转6°
    painters.drawLine(0,0,0,-150);  //画出秒针
    painters.end();

    QPainter painterm(this);  //定义一个画家来控制分针
    painterm.setRenderHint(QPainter::Antialiasing,true);
    mypen.setWidth(4);
    mypen.setColor(Qt::blue);
    painterm.setPen(mypen);
    painterm.translate(center);
    painterm.rotate(m*6);  //分针每次转6°(一小格)
    painterm.drawLine(0,0,0,-150);
    painterm.end();

    QPainter painterh(this);  //定义一个画家来控制时针
    painterh.setRenderHint(QPainter::Antialiasing,true);
    mypen.setWidth(7);
    mypen.setColor(Qt::green);
    painterh.setPen(mypen);
    painterh.translate(center);
    painterh.rotate(h*30+m*0.5);  //时针每小时偏移30°并在原来的基础上每分钟偏移0.5°
    painterh.drawLine(0,0,0,-100);
    painterh.end();

    update();  //刷新绘图事件
}

void Widget::on_btn_miao_clicked()
{
    miaobiao *miaobiao1 = new miaobiao;
    //页面跳转
    miaobiao1->setGeometry(this->geometry());
    miaobiao1->show();
    //关闭时钟界面
    QThread::msleep(50);
    this->close();
}

定时器核心代码

#include "miaobiao.h"
#include "ui_miaobiao.h"
#include "widget.h"
#include <QThread>

static int i;

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

    //信号 timeout 与槽函数绑定
    connect(&timer2,SIGNAL(timeout()),this,SLOT(timeOut_Slot()));
    time2.setHMS(0,0,0,0);
    ui->time->setText("00:00:00:000");
}

miaobiao::~miaobiao()
{
    delete ui;
}

void miaobiao::on_btn_clock_clicked()
{
    Widget *shizhong = new Widget;
    //页面跳转
    shizhong->setGeometry(this->geometry());
    shizhong->show();
    //关闭秒表界面
    QThread::msleep(50);
    this->close();
}

//开始定时
void miaobiao::on_btn_start_clicked()
{
    timer2.start(3);
}

//显示计时时间
void miaobiao::timeOut_Slot()
{
    time2 = time2.addMSecs(3);
    ui->time->setText(time2.toString("hh:mm:ss.zzz"));
}

//关闭计时器
void miaobiao::on_btn_close_clicked()
{
    timer2.stop();
    i = 0;
}

//重置计时器
void miaobiao::on_btn_restart_clicked()
{
    timer2.stop();
    time2.setHMS(0,0,0,0);
    ui->time->setText("00:00:00:000");
    ui->jilu->clear();
    i = 0;
}

void miaobiao::on_btn_dadian_clicked()
{
    QString temp;
    i=i+1;
    temp.sprintf("第%d次: ",i);
    ui->jilu->append(temp);
    ui->jilu->append(time2.toString("hh:mm:ss.zzz"));
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

琪琪猫不会嵌入式

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值