效果展示
做成了一个时钟类,提供了一个秒数的接口来控制时钟类的事件!!!
时钟类的头文件
#ifndef MYCLOCK_H
#define MYCLOCK_H
#include <QWidget>
#include <QPaintEvent>
//绘图工具
#include <QPainter> //绘图方法
#include <QPen> //绘图笔
#include <QBrush> //画刷
#include<QTime>
#include<QTimer>
#include<QLCDNumber>
#include <QDebug>
#include <QIcon>
#include <QPainter>
class MyClock : public QWidget
{
Q_OBJECT
public:
explicit MyClock(int i,QWidget *parent = nullptr);
void paintEvent(QPaintEvent *ev);
void setSecond(int s);
signals:
private:
int i; //给外部提供接口,改变秒数
};
#endif // MYCLOCK_H
时钟类的CPP文件
#include "myclock.h"
MyClock::MyClock(int i,QWidget *parent) : QWidget(parent)
{
this->setWindowTitle("我的时钟");
this->setFixedSize(100,100);
this->setWindowIcon(QIcon("3.png"));
QTimer *timer = new QTimer(this);//产生一个定时器
connect(timer,SIGNAL(timeout()), this,SLOT(update()));//关联定时器的信号与槽
timer->start(1000);//开始定时器,每一秒钟更新一次
}
void MyClock::paintEvent(QPaintEvent *ev)
{
QTime time=QTime::currentTime();
/***************准备三个顶点*******************/
static const QPoint hour[3] = {
QPoint(14, 15),
QPoint(-14, 15),
QPoint(0, -130)
};
static const QPoint minute[3] = {
QPoint(11, 13),
QPoint(-11, 13),
QPoint(0, -160)
};
static const QPoint second[3] = {
QPoint(7, 8),
QPoint(-7, 8),
QPoint(0, -200)
};
/***************定义画刷*******************************/
QBrush brush;//定义画刷
brush.setColor(QColor(245,182,96));//设置画刷颜色
brush.setStyle(Qt::SolidPattern);//设置样式
/***************画圆***********************************************/
QPainter p1(this);
QPen pen;
pen.setColor(QColor(203,210,255));
pen.setWidth(18);
p1.translate(width()/2,height()/2);
p1.setPen(pen);
p1.drawEllipse(QPoint(0,0),200,200);
/***************画时小时线***********************************************/
p1.setBrush(brush);//将画刷交给画家
p1.setPen(Qt::NoPen);
p1.save();//保存当下状态
p1.rotate(30.0*(i/60/60/12+i/60/60/60.0));//图形旋转,以原点为旋转中心,顺时针水平旋转对应时针的角度
p1.drawConvexPolygon(hour,3);//画时针这个凸多边形,第一个参数为所有的点,第二个参数为点的个数
p1.restore();//恢复上一次保存的结果,和save()成对出现
pen.setStyle(Qt::SolidLine);
pen.setWidth(5);
pen.setColor(Qt::black);
p1.setPen(pen);
for(int i = 0; i < 12; i++)
{
p1.drawLine(0,170,0,196);//画小时线
p1.drawText(-5,-235,QString::number(i));//表明小时数
p1.rotate(30);//每画一次旋转30度
}
/***************画时分钟线*******************/
p1.setPen(Qt::NoPen);
p1.setBrush(QColor("red"));
p1.save();//保存当下状态
p1.rotate(6.0*(i/60.0/60+i/60.0));//顺时针旋转至分针的位置
p1.drawConvexPolygon(minute,3);//画分针这个凸多边形,第一个参数为所有的点,第二个参数为点的个数
p1.restore();//恢复上一次保存的结果,和save()成对出现
pen.setStyle(Qt::SolidLine);
pen.setColor("red");
pen.setWidth(1);
p1.setPen(pen);
for(int i = 0; i < 60; i++)
{
if( (i%5) != 0)
{
p1.drawLine(0,184,0,196);//画小时线
}
p1.rotate(6);//每画一次旋转30度
}
/***************画时秒线*******************/
p1.setPen(Qt::NoPen);
p1.setBrush(QColor(119,217,175));
p1.save();
p1.rotate(6*i);//顺时针旋转至秒针的位置
p1.drawConvexPolygon(second, 3);//画秒针这个凸多边形,第一个参数为所有的点,第二个参数为点的个数
p1.restore();
/***************画圆心*******************/
//画圆心
p1.setBrush(Qt::black);
p1.setPen(Qt::white);
p1.save();
p1.drawEllipse(QPoint(0,0),3,3);//画圆心
p1.restore();
/***************画圆心*******************/
p1.setPen(Qt::black);
if(time.hour()>=12)
p1.drawText(-6,-50,"PM");//画文本区
else
p1.drawText(-6,-50,"AM");//画文本区
p1.drawText(-8,-140,"大本钟");//画文本区
}
void MyClock::setSecond(int s)
{
this->i = s;
qDebug()<<"**************"<<i;
}
最后主函数要自己写
这个跟QT按键一样,具体怎么用还得自己去写。