QT制作时钟

头函数

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPaintEvent>
#include <QPainter>
#include <QPen>
#include <QTime>     //获取时间
#include <QTimer>    //定时器
#include <QMouseEvent>  //鼠标触发事件
#include <QDebug>
#include <QStringList>

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;

    //重写鼠标按压和移动事件
    void mousePressEvent(QMouseEvent *event) override;
    void mouseMoveEvent(QMouseEvent *event) override;

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

private slots:
    void on_CloseBtn_clicked();

private:
    Ui::Widget *ui;

    QPoint StartPoint;      //定义一个起始点

    //自定义一个整型变量,存放定时器id
    int t_id;
};
#endif // WIDGET_H

源函数

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

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

    //设置纯净窗口(将状态栏隐藏)
    setWindowFlag(Qt::FramelessWindowHint);

    //启动执行逻辑
    this->startTimer(1000);
}

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


void Widget::paintEvent(QPaintEvent *event)
{
    //实例化一个画家类
    QPainter p(this);

    //设置字体
    p.setFont(QFont("楷体"));

    //设置背景颜色
    p.setBrush(QBrush(QColor("pink")));

    //设置画家中心点
    p.translate(this->width()/2, this->height()/2);

    //画圆形
    p.drawEllipse(QPoint(0, 0), 200, 200);

    //画时刻表,画笔颜色
    p.setPen(QColor("green"));

    for(int i=0; i<60; i++)
    {
        p.drawLine(200, 0, 195, 0);     //线的长度
        p.rotate(6);            //倾斜角度
    }

    //加粗
    QPen pen;
    pen.setWidth(3);
    p.setPen(pen);

    //画小时的格子
    for(int i=1; i<=12; i++)
    {
        p.rotate(30);

        p.drawLine(200, 0, 190, 0);
        p.drawText(0, -175, QString("%1").arg(i));
    }

    //获取当前时间
    QTime sysDate = QTime::currentTime();
    //将当前时间转为字符串
    QString time = sysDate.toString();

    //拆分字符串
    int h, m, s;
    QStringList list_time = time.split(":");
    h = list_time[0].toUInt();
    m = list_time[1].toUInt();
    s = list_time[2].toUInt();

    //时间获取到后,开始运行计时器
    t_id = this->startTimer(1000);

    //绘制秒针
    p.setPen(QColor("black"));
    p.setPen(pen);
    p.rotate(s*6);
    p.drawLine(0, 0, 0, -170);
    p.rotate(-s*6);

    //绘制分针
    pen.setWidth(2);
    p.setPen(pen);
    p.rotate(m*6 + s*6/60);
    p.drawLine(0,0 , 0,-120);
    p.rotate(-m*6 - s*6/60);

    //绘制时针
    pen.setWidth(3);
    p.setPen(pen);
    p.rotate((h%12)*30 + m*6/60 + s*6/60/12);
    p.drawLine(0,0 , 0,-80);
    p.rotate(-(h%12)*30 - m*6/60 - s*6/60/12);

    update();
}


//鼠标左键按压事件
void Widget::mousePressEvent(QMouseEvent *event)
{
    StartPoint = event->globalPos() - this->frameGeometry().topLeft();
    //event->globalPos():获取鼠标相对于整个屏幕的坐标点
    //this->framGeometry():获取整个界面矩形框
    //this->frameGeometry().topLeft():界面矩形框左上角相当于整个屏幕的坐标
}

//鼠标移动事件
void Widget::mouseMoveEvent(QMouseEvent *event)
{
    this->move(event->globalPos() - StartPoint);
}

void Widget::on_CloseBtn_clicked()
{
    //关闭窗口
    close();
}

现象

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值