qt设计一个钟表

头文件:

#ifndef PAINT_H
#define PAINT_H

#include <QWidget>
#include <QPaintEvent>
#include <QtDebug>
#include <QPainter>
#include <QColor>
#include <QTimer>
#include <QTime>
#include <QTimerEvent>
#include <QDateTime>
#include <QPalette>
#include <QMouseEvent>


QT_BEGIN_NAMESPACE
namespace Ui { class paint; }
QT_END_NAMESPACE

class paint : public QWidget
{
    Q_OBJECT

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

    //重写事件处理函数
    void paintEvent(QPaintEvent *event) override;

    void timerEvent(QTimerEvent *event) override;

    void mousePressEvent(QMouseEvent *event) override;

    void mouseMoveEvent(QMouseEvent *event) override;

private:
    Ui::paint *ui;

    int t_id;

    int hh=0,mm=0,ss=0;

    //定义Qpoint类记录鼠标起始点
    QPoint startPoint;
};
#endif // PAINT_H

主函数:

#include "paint.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    paint w;
    w.show();
    return a.exec();
}

功能函数:

#include "paint.h"
#include "ui_paint.h"

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

    t_id = this->startTimer(1000);



    setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint);//去掉标题栏
    setAttribute(Qt::WA_TranslucentBackground, true);//设置窗口背景透明

}

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

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

    //给画家类设置画笔
    p1.setPen(QColor(77,65,182));

    //给画家设置字体
    p1.setFont(QFont("华文隶书"));

    //设置画家坐标起点
    p1.translate(this->width()/2, this->height()/2);

    //绘制矢量文字
    //p1.drawText(this->width()/2, this->height()/2, "hello world");

    p1.setBrush(QBrush(QColor(213,248,253)));

    //画圆形
    p1.drawEllipse(QPointF(0,0),200,200);

    //画时刻表
    p1.setPen(QColor(255,0,0));
    for(int i = 0; i < 60; i ++){
        p1.drawLine(200,0, 190,0);
        p1.rotate(6);
    }

    //画小时格子
    QPen pen;
    pen.setWidth(3);
    p1.setPen(pen);
    for(int i = 1; i<= 12; i ++){
        p1.rotate(30);
        p1.drawLine(0,-200, 0,-185);
        p1.drawText(0,-170, QString("%1").arg((i)));
    }

    QPainter p2(this);

    p2.setPen(QColor(38,251,235));
    p2.translate(this->width()/2, this->height()/2);
    p2.rotate(-90);
    QPen pen2;
    pen2.setWidth(3);
    p2.setPen(pen2);
    //绘制秒针:
    p2.rotate(ss*6);
    p2.drawLine(0,0, 160,0);

    //绘制分针:
    p2.rotate(-ss*6);
    p2.rotate(mm*6+ss*6/60);
    p2.drawLine(0,0, 120,0);

    //绘制时针:
    p2.rotate(-mm*6-ss*6/60);
    p2.rotate(hh*30+mm*6/12+ss*6/60/12);
    p2.drawLine(0,0, 100,0);
}

void paint::timerEvent(QTimerEvent *event)
{
    if(event->timerId() == t_id){
        QDateTime NowTime = QDateTime::currentDateTime();

        QString NowTimeString = NowTime.toString("hh:mm:ss");


        QStringList list = NowTimeString.split(":");
        hh = list[0].toUInt();
        mm = list[1].toUInt();
        ss = list[2].toUInt();
        update();
    }
}


void paint::mousePressEvent(QMouseEvent *event)
{
    startPoint = event->globalPos() - this->frameGeometry().topLeft();
}

void paint::mouseMoveEvent(QMouseEvent *event)
{
    this->move(event->globalPos() - startPoint);
}

结果如下:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值