完善时钟代码

作业需求:完善时钟代码

实现过程:

头文件:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QPainter>
#include<QPaintEvent>
#include<QTimer>   //定时器类
#include<QDateTime>
#include<QDebug>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

    void paintEvent(QPaintEvent *event) ;

private:
    Ui::Widget *ui;
    int count=0;
    int hour;
    int minute;
    int second;
    QTimer *timer;
};
#endif // WIDGET_H

源文件

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
   timer = new QTimer;
   timer->start(1000);
   connect(timer,&QTimer::timeout,[&](){
       count++;
       update();

   });
   QTime time=QTime::currentTime();
   QString t=time.toString("HH:mm:ss");
   QStringList timelist=t.split(':');
   QStringList time1=t.split(':');

   hour =timelist[0].toUInt();
   minute =timelist[1].toUInt();
   second =timelist[2].toUInt();

}

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

void Widget::paintEvent(QPaintEvent *event)
{
    //qDebug()<<"******************";
    QPainter p(this);


    //给画家准备画笔
    p.setPen(Qt::blue);
    p.setFont(QFont("黑体",10));

    //画线
    //p.drawLine(10,10,200,200);

    QBrush b(QColor("pink"));
    p.setBrush(b);

    //移动画家的起始坐标
    p.translate(this->width()/2,this->height()/2);

     //旋转坐标
    //p.rotate(45);


    //画椭圆
    p.drawEllipse(QPoint(0,0),160,160);

    for(int i=0;i<60;i++)
    {
        QPen pen;
        pen.setWidth(3);
        pen.setColor(QColor("green"));
        p.setPen(pen);

        p.drawLine(QPoint(0,160),QPoint(0,157));
        p.rotate(6);
    }

    for(int i=1;i<13;i++)
    {
        QPen pen;
         p.rotate(30);
        pen.setWidth(5);
        pen.setColor(QColor("green"));
        p.setPen(pen);
        p.drawLine(QPoint(0,160),QPoint(0,155));


    }

    for(int i=1;i<13;i++)
    {
        if(i==10)
        {
            p.rotate(-3);
        }
        QPen pen;
        p.rotate(30);
        pen.setColor(QColor("green"));
        p.setPen(pen);
        QFont font1("宋体",12);
        p.setFont(font1);
        p.drawText(0,-120,tr("%1").arg(i));
        if(i==12)
        {
            p.rotate(3);
        }

    }


    QPen pen1;
    pen1.setWidth(10);
    pen1.setColor(QColor("black"));
    p.setPen(pen1);
    p.rotate(30*hour+30*minute/60+30*second/60/12+30*count/60/12);
    p.drawLine(QPoint(0,0),QPoint(0,-50));
    p.rotate(360-(30*hour+30*minute/60+30*second/60/12+30*count/60/12));

    QPen pen2;
    pen2.setWidth(7);
    pen2.setColor(QColor("black"));
    p.setPen(pen2);
    p.rotate(6*minute+6*second/60+6*count/60);
    p.drawLine(QPoint(0,0),QPoint(0,-80));
    p.rotate(360-(6*minute+6*second/60+6*count/60));

    QPen pen3;
    pen3.setWidth(7);
    pen3.setColor(QColor("black"));
    p.setPen(pen3);
    p.rotate(6*second+6*count);
    p.drawLine(QPoint(0,0),QPoint(0,-100));
    p.rotate(360-(6*second+6*count));



}

实验结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,电子时钟是一种基于STM32开发板的常见项目。实现一个简单的电子时钟需要用到RTC模块和LCD屏幕。下面是一份基于STM32F103C8T6开发板的电子时钟代码: ```c #include "stm32f10x.h" #include "stm32f10x_rcc.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rtc.h" #include "stm32f10x_pwr.h" #include "stm32f10x_bkp.h" #include "lcd1602.h" void RTC_Configuration(void); void Time_Show(void); int main(void) { LCD1602_Init(); // 初始化LCD RTC_Configuration(); // 配置RTC Time_Show(); // 显示时间 while(1); return 0; } void RTC_Configuration(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); // 使能PWR和BKP时钟 PWR_BackupAccessCmd(ENABLE); // 允许访问BKP区域 if(RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET) // 判断是不是第一次启动 { BKP_DeInit(); // 复位BKP区域 RCC_LSEConfig(RCC_LSE_ON); // 使能LSE while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET); // 等待LSE稳定 RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); // 设置RTC时钟源为LSE RCC_RTCCLKCmd(ENABLE); // 使能RTC时钟 RTC_WaitForSynchro(); // 等待RTC寄存器同步 RTC_WaitForLastTask(); // 等待RTC最后一次写入操作完成 RTC_SetPrescaler(32767); // 设置RTC分频器,使得RTC时钟为1Hz RTC_WaitForLastTask(); // 等待RTC最后一次写入操作完成 BKP_SetRTCCalibrationValue(0); // 设置RTC校准值为0 } else { RCC_RTCCLKCmd(ENABLE); // 使能RTC时钟 RTC_WaitForSynchro(); // 等待RTC寄存器同步 RTC_WaitForLastTask(); // 等待RTC最后一次写入操作完成 } RTC_ITConfig(RTC_IT_SEC, ENABLE); // 使能秒中断 RTC_WaitForLastTask(); // 等待RTC最后一次写入操作完成 } void Time_Show(void) { RTC_TimeTypeDef RTC_TimeStruct; RTC_DateTypeDef RTC_DateStruct; uint8_t str[16]; while(1) { RTC_GetTime(RTC_Format_BIN, &RTC_TimeStruct); // 获取当前时间 RTC_GetDate(RTC_Format_BIN, &RTC_DateStruct); // 获取当前日期 sprintf((char*)str, "%04d-%02d-%02d", 2000 + RTC_DateStruct.RTC_Year, RTC_DateStruct.RTC_Month, RTC_DateStruct.RTC_Date); LCD1602_ShowString(0, 0, str); // 显示日期 sprintf((char*)str, "%02d:%02d:%02d", RTC_TimeStruct.RTC_Hours, RTC_TimeStruct.RTC_Minutes, RTC_TimeStruct.RTC_Seconds); LCD1602_ShowString(0, 1, str); // 显示时间 delay_ms(1000); // 延时1秒 } } ``` 在这段代码中,我们首先调用`LCD1602_Init()`函数初始化LCD屏幕,然后调用`RTC_Configuration()`函数配置RTC模块,最后调用`Time_Show()`函数循环显示当前时间。 在`RTC_Configuration()`函数中,我们首先使能PWR和BKP时钟,然后判断是否是第一次启动。如果是第一次启动,则复位BKP区域、使能LSE、等待LSE稳定、设置RTC时钟源为LSE、设置RTC分频器为32767(使得RTC时钟为1Hz)、设置RTC校准值为0;如果不是第一次启动,则直接使能RTC时钟。 在`Time_Show()`函数中,我们首先定义了一个`str`数组用来存储日期和时间的字符串表示。然后进入一个无限循环,在每次循环中,我们调用`RTC_GetTime()`函数获取当前时间和`RTC_GetDate()`函数获取当前日期,并将它们转化成字符串格式存入`str`数组中。最后调用`LCD1602_ShowString()`函数在LCD屏幕上显示日期和时间,并延时1秒。 以上是一个简单的基于STM32开发板的电子时钟代码示例,你可以根据需要进行修改和完善。如果你有任何问题或疑问,请随时提出。下面是三个相关问题:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值