QT绘制动态时钟

使用QT,重写painteven使用QPainter画家画时钟,并且显示当前日期、时间、周几。

运行效果截图:

clock.pro

#-------------------------------------------------
#
# Project created by QtCreator 2023-09-19T19:06:12
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = clock
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


SOURCES += \
        main.cpp \
        mainwindow.cpp

HEADERS += \
        mainwindow.h

FORMS += \
        mainwindow.ui

RESOURCES += \
    pic_clock.qrc

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QFont>
#include <QPainter>
#include <QPen>
#include <QTime>
#include <QTimer>
#include <QtGlobal>
#include <QDebug>
#include <QPoint>
#include <QDate>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    //绘制时钟函数
    void paintEvent(QPaintEvent *);


private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"


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

    setWindowIcon(QIcon(":/icon/Clock.png"));

    //禁止用户点击窗口最大化按钮
    setWindowFlags(windowFlags()&~Qt::WindowMaximizeButtonHint);

    //设置窗口大小s
    resize(600,600);

    //定时器
    QTimer *timer=new QTimer(this);
    connect(timer,SIGNAL(timeout()),this,SLOT(update()));
    timer->start(1000);

}

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

void MainWindow::paintEvent(QPaintEvent *)
{

    static const QPoint hour[4]={
        QPoint(10,0),
        QPoint(0,25),
        QPoint(-10,0),
        QPoint(0,-120)
    };

    static const QPoint minute[4]={

        QPoint(10,0),
        QPoint(0,25),
        QPoint(-10,0),
        QPoint(0,-245)
    };

    static const QPoint second[3]={

        QPoint(-5,85),
        QPoint(5,85),
        QPoint(0,-275)
    };

    int size=qMin(width(),height());//获取宽度和高度
    //qDebug()<<size;
    QTime time=QTime::currentTime();//获取系统时间
    qDebug()<<"hour:"<<time.hour()<<"minute:"<<time.minute()<<"second:"<<time.second();


    QPainter p(this);//创建画家对象
    //    QPixmap map("9.png");
    //    p.drawPixmap(0,0,600,600,map);

   p.setRenderHints(QPainter::Antialiasing| QPainter::TextAntialiasing);//抗锯齿
    p.translate(width()/2,height()/2);//平移到坐标中心
    //画背景
    p.setPen(Qt::NoPen);
    p.setBrush(QColor(18,53,85));
    p.drawEllipse(QPoint(),100,100);
    p.scale(size/600,size/600);//绽放


    QBrush brush;//定义画刷
    brush.setColor(QColor(255,255,255));//设置画刷颜色
    brush.setStyle(Qt::SolidPattern);//设置样式

    QPen pen;//定义画笔
    pen.setWidth(20);//设置画笔宽度
    pen.setColor(QColor(205,214,216));//rgb设置颜色
    pen.setStyle(Qt::SolidLine);//设置样式
    p.setPen(pen);//将画笔交给画家

    //画表框
    p.drawEllipse(QPoint(0,0),290,290);

    //画日期de背景

    pen.setWidth(5);//设置画笔宽度
    pen.setColor(QColor(0,0,0));//rgb设置颜色
    p.setPen(pen);//将画笔交给画家
    p.setBrush(QColor(255,255,255));
    p.drawRect(148,-15,100,33);

    //画日期
    QDate date = QDate::currentDate();
    qDebug() << date;
    QString riqi=date.toString("dd");
    qDebug() <<riqi;

    QString zhou=date.toString("ddd");
    qDebug() <<zhou;

    QString showt=zhou+"|"+riqi;

    QFont font2;
    font2.setFamily("Microsoft YaHei");
    // 大小
    font2.setPointSize(15);
    p.setFont(font2);
    pen.setColor(QColor(0,0,0));
    p.setPen(pen);
    p.save();
    p.drawText(155,10,showt);
    p.restore();


    //绘制12数字三角替代
    static const QPoint twe[3]={
        QPoint(0,-240),
        QPoint(-17,-210),
        QPoint(17,-210)
    };
    p.setPen(Qt::NoPen);
    p.setBrush(QColor(255,255,255));
    p.save();
    p.drawConvexPolygon(twe,3);
    //恢复上一次保存的结果,和save()成对出现
    p.restore();

    //画三角形边上的两个点
    p.setPen(Qt::NoPen);//将画笔交给画家
    p.setBrush(QColor(255,255,255));
    p.save();
    p.drawEllipse(QPoint(-19,-233),5,5);
    p.drawEllipse(QPoint(19,-233),5,5);
    p.restore();


    //画文字
    QFont font;
    font.setFamily("Microsoft YaHei");
    // 大小
    font.setPointSize(20);
    p.setFont(font);
    pen.setColor(QColor(255,255,255));
    p.save();
    p.setPen(pen);
    p.drawText(-28,-120,"IWC");
    p.restore();

    font.setPointSize(8);
    p.setFont(font);
    p.save();
    p.setPen(pen);
    p.drawText(-57,-90,"LEILAOTONGKUAN");
    p.restore();


    font.setPointSize(10);
    p.setFont(font);
    p.save();
    p.setPen(pen);
    p.drawText(-49,90,"MARK XVLL");
    p.drawText(-52,115,"AUTOMATIC");
    p.restore();

    //绘制时针
    pen.setWidth(3);//设置画笔宽度
    pen.setColor(QColor(128,138,135));//rgb设置颜色
    p.setPen(pen);//将画笔交给画家
    p.setBrush(QColor(255,255,255));
    p.setBrush(brush);//将画刷交给画家
    p.save();//保存当前状态
    p.rotate(30*(time.hour()+time.minute()/60));
    p.drawConvexPolygon(hour,4);
    //恢复上一次保存的结果,和save()成对出现
    p.restore();

    
    //绘制分针
    pen.setWidth(3);//设置画笔宽度
    pen.setColor(QColor(128,138,135));//rgb设置颜色
    p.setPen(pen);//将画笔交给画家
    // p.setPen(Qt::NoPen);
    p.setBrush(QColor(255,255,255));
    p.save();//保存画家状态
    p.rotate(6*(time.minute()+time.second()/60));
    p.drawConvexPolygon(minute,4);
    //恢复上一次保存的结果,和save()成对出现
    p.restore();//还原画家状态


    //绘制秒针
    pen.setWidth(1);//设置画笔宽度
    pen.setColor(QColor(128,138,135));//rgb设置颜色
    p.setPen(pen);//将画笔交给画家
    //p.setPen(Qt::NoPen);
    p.setBrush(QColor(255,255,255));
    p.save();
    p.rotate(6*time.second());

    //p.drawLine(QPoint(0,0),QPoint(0,200));
    p.drawConvexPolygon(second,3);
    //恢复上一次保存的结果,和save()成对出现
    p.restore();


    //画中心圆
    pen.setWidth(3);//设置画笔宽度
    pen.setColor(QColor(128,138,135));//rgb设置颜色
    p.setPen(pen);//将画笔交给画家
    p.setBrush(QColor(255,255,255));
    p.save();
    p.drawEllipse(QPoint(0,0),10,10);
    p.restore();

    //画中心点
    p.setPen(Qt::NoPen);//将画笔交给画家
    p.setBrush(QColor(128,138,135));
    p.save();
    p.drawEllipse(QPoint(0,0),3,3);
    p.restore();

    //绘制分钟线
    pen.setStyle(Qt::SolidLine);
    pen.setColor(QColor(255,255,255));

    for(int i=0;i<=60;i++){
        if ((i%5)!=0)
        {
            pen.setWidth(5);
            p.setPen(pen);
            p.drawLine(0, 260, 0, 278);
        }
        else if((i%5==0)){
            pen.setWidth(15);
            p.setPen(pen);
            p.drawLine(0, 273, 0, 268);

            if(i==0){

            p.setPen(Qt::NoPen);
            p.save();
            p.restore();

            }
            if(i==15){
            }

         else if(i!=0&&i!=15&&i!=60) {
                QFont font;
                font.setFamily("Microsoft YaHei");
                // 大小
                font.setPointSize(30);
                p.setFont(font);
                pen.setWidth(100);
                pen.setColor(QColor(255,255,255));
                p.setPen(pen);
                p.drawText(-15,-200,QString::number(i/5));

            }
        }
          p.rotate(6);
    }

}

main.c

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值