头函数
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QPaintEvent>
#include <QPainter>
#include <QPen>
#include <QTime> //获取时间
#include <QTimer> //定时器
#include <QMouseEvent> //鼠标触发事件
#include <QDebug>
#include <QStringList>
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 mousePressEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
//重写定时器处理函数
// void timerEvent(QTimerEvent *event) override;
private slots:
void on_CloseBtn_clicked();
private:
Ui::Widget *ui;
QPoint StartPoint; //定义一个起始点
//自定义一个整型变量,存放定时器id
int t_id;
};
#endif // WIDGET_H
源函数
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//设置纯净窗口(将状态栏隐藏)
setWindowFlag(Qt::FramelessWindowHint);
//启动执行逻辑
this->startTimer(1000);
}
Widget::~Widget()
{
delete ui;
}
void Widget::paintEvent(QPaintEvent *event)
{
//实例化一个画家类
QPainter p(this);
//设置字体
p.setFont(QFont("楷体"));
//设置背景颜色
p.setBrush(QBrush(QColor("pink")));
//设置画家中心点
p.translate(this->width()/2, this->height()/2);
//画圆形
p.drawEllipse(QPoint(0, 0), 200, 200);
//画时刻表,画笔颜色
p.setPen(QColor("green"));
for(int i=0; i<60; i++)
{
p.drawLine(200, 0, 195, 0); //线的长度
p.rotate(6); //倾斜角度
}
//加粗
QPen pen;
pen.setWidth(3);
p.setPen(pen);
//画小时的格子
for(int i=1; i<=12; i++)
{
p.rotate(30);
p.drawLine(200, 0, 190, 0);
p.drawText(0, -175, QString("%1").arg(i));
}
//获取当前时间
QTime sysDate = QTime::currentTime();
//将当前时间转为字符串
QString time = sysDate.toString();
//拆分字符串
int h, m, s;
QStringList list_time = time.split(":");
h = list_time[0].toUInt();
m = list_time[1].toUInt();
s = list_time[2].toUInt();
//时间获取到后,开始运行计时器
t_id = this->startTimer(1000);
//绘制秒针
p.setPen(QColor("black"));
p.setPen(pen);
p.rotate(s*6);
p.drawLine(0, 0, 0, -170);
p.rotate(-s*6);
//绘制分针
pen.setWidth(2);
p.setPen(pen);
p.rotate(m*6 + s*6/60);
p.drawLine(0,0 , 0,-120);
p.rotate(-m*6 - s*6/60);
//绘制时针
pen.setWidth(3);
p.setPen(pen);
p.rotate((h%12)*30 + m*6/60 + s*6/60/12);
p.drawLine(0,0 , 0,-80);
p.rotate(-(h%12)*30 - m*6/60 - s*6/60/12);
update();
}
//鼠标左键按压事件
void Widget::mousePressEvent(QMouseEvent *event)
{
StartPoint = event->globalPos() - this->frameGeometry().topLeft();
//event->globalPos():获取鼠标相对于整个屏幕的坐标点
//this->framGeometry():获取整个界面矩形框
//this->frameGeometry().topLeft():界面矩形框左上角相当于整个屏幕的坐标
}
//鼠标移动事件
void Widget::mouseMoveEvent(QMouseEvent *event)
{
this->move(event->globalPos() - StartPoint);
}
void Widget::on_CloseBtn_clicked()
{
//关闭窗口
close();
}
现象