基于Qt的时钟设计

整体思路:

时钟本身使用paintEvent函数进行绘制,使用timerEvent进行定时刷新。

  1. 绘制时钟,通过paintEvent实现,包括:时钟背景,表盘,刻度线,数字以及时针,分针,秒针。

  2. 使用timerEvent定时刷新,设置刷新时间为1000毫秒(1秒)

源码:

  • 绘制时钟表盘,我这里的指针用一条线代替,线的起点固定为表盘中心,终点为随时间变化的函数。随着函数的不断调用,秒针终点也不断变化。
void Dialog::paintEvent(QPaintEvent* event)
    {
        QPainter painter(this);

        QPixmap map(":/new/prefix1/clock1.jpg");   //为时钟添加背景图片
        QRect q(0,0,769,960);
        QRect q2(0,0,width(),height());
        painter.drawPixmap(q2,map,q);

        //基础的表盘结构通过循环结构——利用三角函数标示刻度
        painter.drawEllipse(100,100,320,320);
        double x1,x2,y1,y2;
        for(int j=0;j<60;j++)
        {
            x1=260+160*cos(2*PI/60*j);
            y1=260+160*sin(2*PI/60*j);
            x2=260+155*cos(2*PI/60*j);
            y2=260+155*sin(2*PI/60*j);
            painter.drawLine(x1,y1,x2,y2);

            x1=260+160*cos(2*PI/12*j);
            y1=260+160*sin(2*PI/12*j);
            x2=260+150*cos(2*PI/12*j);
            y2=260+150*sin(2*PI/12*j);
            painter.drawLine(x1,y1,x2,y2);
        }


        //十二个数字,在这一过程中可以对半径以及中心微调使得数字更整齐
        int R=143;
        for(int i=1;i<13;i++)
        {
            painter.drawText(255+R*sin(2*PI/12*i),261-R*cos(2*PI/12*i),QString::number(i));
        }


        //将秒针的终点与timerEvent关联,让秒针随着时间的调用动起来
        int i;
        double x,y;
        for( i=0;i<60;i++)
        {

            x=260+150*cos(2*PI/60*t);
            y=260+150*sin(2*PI/60*t);

        }
        painter.drawLine(260,260,x,y);//秒针
        painter.drawLine(260,260,290,150);//分针
        painter.drawLine(260,260,271,171);//时针



    }

  • 函数timerEvent,随着时间的不断变化,重绘函数paintEvent
void Dialog::timerEvent(QTimerEvent* event)
{
      t++;
      repaint();
}

整体代码

  • (dialog.cpp)
#include "dialog.h"
#include "ui_dialog.h"
#include<QPainter>
#include<QTimer>
#include<QPixmap>
#define PI 3.1415926
Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Dialog)
{
    ui->setupUi(this);

      startTimer(1000);//括号中指调用一次所用多少毫秒;每隔相应的时间调用一次函数
}

Dialog::~Dialog()
{
    delete ui;
}
int t;
void Dialog::paintEvent(QPaintEvent* event)
    {
        QPainter painter(this);

        QPixmap map(":/new/prefix1/clock1.jpg");   //为时钟添加背景图片
        QRect q(0,0,769,960);
        QRect q2(0,0,width(),height());
        painter.drawPixmap(q2,map,q);

        //基础的表盘结构通过循环结构——利用三角函数标示刻度
        painter.drawEllipse(100,100,320,320);
        double x1,x2,y1,y2;
        for(int j=0;j<60;j++)
        {
            x1=260+160*cos(2*PI/60*j);
            y1=260+160*sin(2*PI/60*j);
            x2=260+155*cos(2*PI/60*j);
            y2=260+155*sin(2*PI/60*j);
            painter.drawLine(x1,y1,x2,y2);

            x1=260+160*cos(2*PI/12*j);
            y1=260+160*sin(2*PI/12*j);
            x2=260+150*cos(2*PI/12*j);
            y2=260+150*sin(2*PI/12*j);
            painter.drawLine(x1,y1,x2,y2);
        }


        //十二个数字,在这一过程中可以对半径以及中心微调使得数字更整齐
        int R=143;
        for(int i=1;i<13;i++)
        {
            painter.drawText(255+R*sin(2*PI/12*i),261-R*cos(2*PI/12*i),QString::number(i));
        }


        //将秒针的终点与timerEvent关联,让秒针随着时间的调用动起来
        int i;
        double x,y;
        for( i=0;i<60;i++)
        {

            x=260+150*cos(2*PI/60*t);
            y=260+150*sin(2*PI/60*t);

        }
        painter.drawLine(260,260,x,y);//秒针
        painter.drawLine(260,260,290,150);//分针
        painter.drawLine(260,260,271,171);//时针



    }

void Dialog::timerEvent(QTimerEvent* event)
{
      t++;
      repaint();

}
  • (Dialog.h)
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE

class Dialog : public QDialog
{
    Q_OBJECT

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

    void paintEvent(QPaintEvent* event);
    void timerEvent(QTimerEvent* event);
private:
    Ui::Dialog *ui;
};
#endif // DIALOG_H

效果图

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值