通过代码实现电子钟表
头文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include<QPaintEvent>
#include<QDebug>
#include<QPainter>
#include<QFont>
#include<QTime>
#include<QTimer>
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;
private:
Ui::Widget *ui;
int m_sec = 0;
int m_min = 0;
int m_hour = 0;
QTimer *timer;
void timeout_slot();
};
#endif // WIDGET_H
源文件
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
timer = new QTimer(this);
timer->start(1000);//一秒钟
connect(timer, &QTimer::timeout, this, &Widget::timeout_slot);
}
Widget::~Widget()
{
delete ui;
}
void Widget::paintEvent(QPaintEvent *event)
{
//实例化画家1
QPainter painter(this);
//实例化一个画笔
QPen pen; //使用无参构造
pen.setColor(QColor("black")); //设置画笔颜色
//pen.setStyle(Qt::DashDotDotLine); //设置线型
pen.setWidth(5); //设置画笔宽度
//将画笔给画家
painter.setPen(pen);
//给画家安排画刷
painter.setBrush(QBrush(QColor("skyblue")));
//给画家偏移起始坐标点
painter.translate(this->width()/2, this->height()/2);
//给画家偏移坐标系
//painter.rotate(0); //旋转坐标系
//画个椭圆
painter.drawEllipse(QPoint(0,0), 200, 200);
//画刻度线
for(int i = 1; i <=60; ++i)
{
painter.save();
painter.rotate(6*i);//坐标轴旋转6度
if (i % 5 == 0)
{
painter.drawLine(0, -188, 0, -200);
painter.drawText(QPoint(-6,-160), QString::number(i/5));
}
else
{
painter.drawLine(0, -192, 0, -200);
}
painter.restore();//绘制图形后复位坐标系
}
painter.save();
painter.rotate(6*m_sec);
painter.drawLine(0,0,0,-170);
painter.restore();
painter.save();
painter.rotate(6*m_min);
painter.drawLine(0,0,0,-140);
painter.restore();
painter.save();
painter.rotate(30*m_hour);
painter.drawLine(0,0,0,-110);
painter.restore();
}
void Widget::timeout_slot()
{
QDateTime datetime = QDateTime::currentDateTime();
m_sec = datetime.time().second();
m_min = datetime.time().minute();
m_hour = datetime.time().hour();
update();
}
主函数
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
效果展示