头文件
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QTimer>//定时器类
#include<QTimerEvent> //定时器事件类
#include<QDateTime>//日期时间类
#include<QtDebug>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void timerEvent(QTimerEvent *ev) override;private slots://启动按钮void on_pushButton_clicked();//取消按钮void on_pushButton_2_clicked();void timeout_slot();private:Ui::Widget *ui;QTimer *objTimer;int eventTimerId;
};
#endif // WIDGET_H
cpp文件
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//实例化定时器空间objTimer = new QTimer(this);//将信号与槽函数绑定connect(objTimer,&QTimer::timeout,this,&Widget::timeout_slot);
}Widget::~Widget()
{delete ui;
}//定时器事件处理函数实现
void Widget::timerEvent(QTimerEvent *ev)
{//判断具体是哪个定时器被触发if(ev->timerId() == eventTimerId){//获取系统日期时间QDateTime sysDateTime = QDateTime::currentDateTime();//将日期转字符串QString dt = sysDateTime.toString("yyyy-MM-dd hh:mm:ss");ui->lineEdit->setText(dt);}
}//启动按钮槽函数
void Widget::on_pushButton_clicked()
{//判断按钮上文本内容if(ui->pushButton->text() == "启动"){//每隔1000毫秒,定时器发送一个timeout信号objTimer->start(1000);}}//取消按钮槽函数
void Widget::on_pushButton_2_clicked()
{if(ui->pushButton_2->text() == "取消"){//取消objTimer->stop();}
}//timeout信号对应的槽函数
void Widget::timeout_slot()
{//获取当前系统时间QTime sysTime = QTime::currentTime();QString t = sysTime.toString("hh:mm:ss");ui->lineEdit->setText(t);// 获取用户输入的时间QString targetTime = ui->lineEdit_2->text();// 定义时间格式QString format = "hh:mm:ss";// 转换为QTimeQTime time = QTime::fromString(targetTime, format);qDebug()<<sysTime;qDebug()<<targetTime;qDebug()<<time;if(sysTime>=time){// 时间到达,输出文字ui->textEdit->append("天上剑仙三百万,见我也须尽低眉。");// 停止定时器objTimer->stop();}
}
绘制一个钟表
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QPainter>
#include <QTime>
#include <QTimer>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void drawClockFace(QPainter *painter);void drawHourHand(QPainter *painter, const QTime &time);void drawMinuteHand(QPainter *painter, const QTime &time);void drawSecondHand(QPainter *painter, const QTime &time);protected:void paintEvent(QPaintEvent *event) override;private:Ui::Widget *ui;QTimer *timer;
};
#endif // WIDGET_H
cpp文件
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 创建定时器,每秒更新一次界面timer = new QTimer(this);connect(timer, &QTimer::timeout, this, QOverload<>::of(&QWidget::update));timer->start(1000);
}Widget::~Widget()
{delete ui;
}void Widget::paintEvent(QPaintEvent *event) {Q_UNUSED(event);QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);// 移动坐标系到窗口中心int side = qMin(width(), height());painter.translate(width() / 2, height() / 2);painter.scale(side / 200.0, side / 200.0);// 绘制表盘drawClockFace(&painter);// 获取当前时间QTime currentTime = QTime::currentTime();// 绘制时针drawHourHand(&painter, currentTime);// 绘制分针drawMinuteHand(&painter, currentTime);// 绘制秒针drawSecondHand(&painter, currentTime);
}void Widget::drawClockFace(QPainter *painter) {// 绘制表盘painter->setPen(Qt::black);painter->setBrush(Qt::white);painter->drawEllipse(-90, -90, 180, 180);// 绘制刻度for (int i = 0; i < 60; ++i) {painter->save();painter->rotate(6 * i);if (i % 5 == 0) {painter->setPen(QPen(Qt::black, 3));painter->drawLine(0, -80, 0, -90);} else {painter->setPen(QPen(Qt::black, 1));painter->drawLine(0, -85, 0, -90);}painter->restore();}
}void Widget::drawHourHand(QPainter *painter, const QTime &time) {// 计算时针角度int hour = time.hour() % 12;int minute = time.minute();double angle = (hour + minute / 60.0) * 30;// 绘制时针painter->save();painter->rotate(angle);painter->setPen(Qt::NoPen);painter->setBrush(Qt::black);QPolygon hourHand;hourHand << QPoint(5, 0) << QPoint(-5, 0) << QPoint(0, -40);painter->drawPolygon(hourHand);painter->restore();
}void Widget::drawMinuteHand(QPainter *painter, const QTime &time) {// 计算分针角度int minute = time.minute();int second = time.second();double angle = (minute + second / 60.0) * 6;// 绘制分针painter->save();painter->rotate(angle);painter->setPen(Qt::NoPen);painter->setBrush(Qt::blue);QPolygon minuteHand;minuteHand << QPoint(3, 0) << QPoint(-3, 0) << QPoint(0, -60);painter->drawPolygon(minuteHand);painter->restore();
}void Widget::drawSecondHand(QPainter *painter, const QTime &time) {// 计算秒针角度int second = time.second();double angle = second * 6;// 绘制秒针painter->save();painter->rotate(angle);painter->setPen(Qt::NoPen);painter->setBrush(Qt::red);QPolygon secondHand;secondHand << QPoint(1, 0) << QPoint(-1, 0) << QPoint(0, -80);painter->drawPolygon(secondHand);painter->restore();
}