2023年9月20日

画个钟

头文件:

#ifndef WIDGET_H
#define WIDGET_H

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 


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) override;

    int hour;
    int min;
    int sec;

private:
    Ui::Widget *ui;
    QTimer *timer;
    int timer_id;

private slots:
    void timeout_slot();
};
#endif // WIDGET_H

.cpp文件

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

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    timer = new QTimer(this);
    connect(timer,&QTimer::timeout,this,&Widget::timeout_slot);
    timer->start(1000);
}

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

//绘制事件处理函数的定义
void Widget::paintEvent(QPaintEvent *event)
{
    //实例化一个画家
    QPainter painter(this);

    //实例化一个画笔
    QPen pen;    //无参构造
    pen.setColor(QColor("black"));
    pen.setStyle(Qt::SolidLine);  //设置线形
    pen.setWidth(5);

    painter.setPen(pen);

    //给画家偏移起始坐标点
    painter.translate(this->width()/2,this->height()/2);

    //画个圆
    painter.drawEllipse(QPoint(0,0),200,200);

    pen.setColor(QColor("black"));
    painter.setPen(pen);

    //画出时针间隔
    for(int i=1;i<13;i++)
    {
        painter.rotate(30);
        painter.drawLine(0,-200,0,-180);
        painter.drawText(-5,-160,QString("%0").arg(i));
    }

    //画出分钟间隔
    for(int i=0;i<60;i++)
    {
        painter.rotate(6);
        painter.drawLine(0,-200,0,-195);
    }

    //画出秒针
    painter.rotate(-90);
    painter.rotate(6*sec);
    painter.drawLine(0,0,120,0);

    //画出分针
    painter.rotate(-6*sec);
    painter.rotate(6*min+6*sec/60);
    painter.drawLine(0,0,90,0);

    //画出时针
    pen.setColor(QColor("red"));
    painter.setPen(pen);
    painter.rotate(-6*min-6*sec/60);
    painter.rotate(30*hour+6*min/12+6*sec/60/12);
    painter.drawLine(0,0,70,0);
}

void Widget::timeout_slot()
{
    //获取当前时间
    QTime sys_t = QTime::currentTime();
    //转为字符串
    QString t = sys_t.toString("hh:mm:ss");

    //获取时分秒
    hour = sys_t.hour();
    min = sys_t.minute();
    sec = sys_t.second();

    //触发重绘
    update();

    //显示
    ui->label->setText(t);
}

2023年9月20日_第1张图片

你可能感兴趣的:(c++)