
头文件
#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_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
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";
// 转换为QTime
QTime 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_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
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();
}




2189

被折叠的 条评论
为什么被折叠?



