1> 使用绘制事件完成钟表的绘制
头文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QPainter>
#include <QDebug>
#include <QTime>
#include <QTimer>
#include <QDateTime>
//#include <string>
#include <QPixmap>
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 timeout_slot();
private:
Ui::Widget *ui;
//实例化一个膜
QPixmap *pix;
//定义一个定时器变量
QTimer t1;
};
#endif // WIDGET_H
源文件
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//实例化屏幕膜
pix = new QPixmap(this->size()); //实例化一个膜大小跟当前界面一致
pix->fill(Qt::white); //使用白色进行填充
//将时间函数与t1绑定在一起
t1.start(1000);
connect(&t1, &QTimer::timeout, this, &Widget::timeout_slot);
}
Widget::~Widget()
{
delete ui;
}
void Widget::paintEvent(QPaintEvent *event)
{
//1、准备一个画家,在界面上进行绘制
QPainter p2(this);
//2、将pix绘制到界面上
p2.drawPixmap(QPoint(0,0), *pix);
//实例化一个画家
QPainter painter(this);
//准备画笔
QPen pen;
pen.setStyle(Qt::SolidLine);
pen.setColor(QColor("black"));
pen.setWidth(5);
//准备字体
QFont font;
font.setFamily("楷体"); //设置字体族
font.setStyle(QFont::StyleItalic); //设置字体倾斜
font.setPointSize(13); //设置字号
//将画家和笔绑定
painter.setPen(pen);
//给画家安排字体
painter.setFont(font);
//在屏幕中间画一个圆
painter.translate(this->width()/2,this->height()/2);
int radius=this->width()>this->height()?this->height():this->width();
painter.drawEllipse(QPoint(0,0),radius/2-10,radius/2-10);
//将坐标轴变成正方向
painter.rotate(6+180);
//绘制钟表
for(int i=1;i<=60;i++)
{
if(i%5!=0)
{
painter.drawLine(0,radius/2-20,0,radius/2-10);
}else
{
painter.drawLine(0,radius/2-30,0,radius/2-10);
// 将整数 i 转换为 QString
QString str = QString::number(i/5);
painter.drawText(QPoint(0,radius/2-30-10),str);
}
painter.rotate(6);
}
painter.rotate(-6);
}
void Widget::timeout_slot()
{
pix->fill(Qt::white);
QTime sysTime = QTime::currentTime();
// 分别提取小时、分钟和秒
int hours = sysTime.hour();
int minutes = sysTime.minute();
int seconds = sysTime.second();
qDebug()<<seconds;
//实例化一个画家
QPainter painter(pix);
//准备画笔
QPen pen;
pen.setStyle(Qt::SolidLine);
//将坐标轴移到中点
painter.translate(this->width()/2,this->height()/2);
//将坐标轴变成秒针反向
painter.rotate(180+6*seconds);
//2、使用画家画秒针
pen.setColor(QColor("green"));
pen.setWidth(5);
painter.setPen(pen);
painter.drawLine(0,-20,0,200);
//将坐标轴变成秒针方向
painter.rotate(360-6*seconds+6*minutes);
//2、使用画家画分针
pen.setColor(QColor("blue"));
pen.setWidth(10);
painter.setPen(pen);
painter.drawLine(0,-15,0,150);
//将坐标轴变成秒针方向
painter.rotate(360+30*hours-6*minutes);
//2、使用画家画时针
pen.setColor(QColor("red"));
pen.setWidth(15);
painter.setPen(pen);
painter.drawLine(0,-10,0,100);
//3、更新界面内容
this->update();
}