QT中定时器的应用

头文件

#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();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Caps_Xxlu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值