mainwindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void paintEvent(QPaintEvent *);//绘制时钟函数
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QPainter>
#include<QPen>
#include<QTime>
#include<QTimer>
#include <QLabel>
#include<QPushButton>
#include<QLCDNumber>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//禁止用户点击窗口最大化按钮
setWindowFlags(windowFlags()& ~Qt::WindowMaximizeButtonHint);
//设置窗口大小
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[3]=
{
QPoint(14,15),
QPoint(-14,15),
QPoint(0,-110),
};
static const QPoint minute[3]=
{
QPoint(11,13),
QPoint(-11,13),
QPoint(0,-170),
};
static const QPoint second[3]=
{
QPoint(7,8),
QPoint(-7,8),
QPoint(0,-210),
};
int size=qMin(width(),height());//获取宽度和高度
QTime time=QTime::currentTime();//获取系统当前时间
QPainter p(this);//创建画家对象
p.setRenderHint(QPainter::Antialiasing);//防止图形形变
p.translate(width()/2,height()/2);//平移坐标系到中心
p.scale(size/600.0,size/600.0);//绽放
QBrush brush;//定义一个画刷
brush.setColor(QColor(245,182,95));//设置画刷颜色
brush.setStyle(Qt::SolidPattern);//设置样式
QPen pen;//定义画笔
pen.setWidth(18);//设置画笔宽度
pen.setColor(QColor(205,214,216));//rgb设置颜色
pen.setStyle(Qt::SolidLine);//设置风格
p.setPen(pen);//将画笔交给画家
p.drawEllipse(QPoint(0,0),280,280);//画圆
pen.setWidth(160);
pen.setColor(Qt::white);
p.setPen(pen);//将画笔交给画家
p.drawEllipse(QPoint(0,0),160,160);//画圆
//绘制时针
p.setBrush(brush);//将画刷交给画家
p.setPen(Qt::NoPen);
p.save();//保存当前 状态
//图形旋转,以原点为旋转中心,顺时针水平旋转对应时针角度
p.rotate(30.0*(time.hour()+time.minute()/60.0));
p.drawConvexPolygon(hour,3);
p.restore();//恢复上一次保存的结果,和save()成对出现
//绘制小时线
pen.setStyle(Qt::SolidLine);
pen.setWidth(5);
pen.setColor(Qt::black);
p.setPen(pen);
//绘制分针
p.setPen(Qt::NoPen);
p.setBrush(QColor(144,199,247));
p.save();
p.rotate(6.0*(time.minute()+time.second()/60.0));
p.drawConvexPolygon(minute,3);
p.restore();
//绘制分钟线
pen.setStyle(Qt::SolidLine);
pen.setColor(QColor(0,0,0));
pen.setWidth(1);
p.setPen(pen);
for(int i=0;i<60;i++)
{
if(i%5!=0)
{
p.drawLine(0,265,0,270);//5的位数时不能画,因为有小时线
}
p.rotate(6);//每画一次就旋转6度
}
pen.setStyle(Qt::SolidLine);
pen.setWidth(5);
pen.setColor(Qt::black);
p.setPen(pen);
for(int i=0;i<12;i++)
{
p.drawLine(0,268,0,276);//画小时线
p.drawText(-5,-235,QString::number(i));//表明小时数量
p.rotate(30);//每画一次旋转30度
}
//绘制秒针
p.setPen(Qt::NoPen);
p.setBrush(QColor(119,217,176));
p.save();
p.rotate(6*time.second());//顺时针旋转到秒针的位置
p.drawConvexPolygon(second,3);
p.restore();
//绘制动态时钟,上午 下午
p.setPen(Qt::black);
if(time.hour()>=12)
p.drawText(-6,-50,"PM");//绘制文本区
else
p.drawText(-6,-50,"AM");//绘制文本区
p.drawText(-50,-100,"Made in China");
}
main.cpp:
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
运行效果: