Qt 倒计时或定时器的简单实现

1.相关说明

QTimer类实现定时器或倒计时

2.界面绘制

3.相关主要代码

// widget.h
typedef struct TimeHMS{
    qint32 hour;
    qint32 minute;
    qint32 second;
}TimeHMS;

// widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QTime>
#include <QTimer>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->hms.hour = 0;
    this->hms.minute = 0;
    this->hms.second = 0;
    m_timer = new QTimer(this);
    m_timer->stop();    // 默认定时器关闭
    m_timer->setSingleShot(false);
    m_timer->setTimerType(Qt::PreciseTimer);
    // 间隔时间 1s
    m_timer->setInterval(1000);
    connect(m_timer, &QTimer::timeout, this, &Widget::do_timer_timeout);
}

Widget::~Widget()
{
    delete ui;
}


// 减一秒
bool Widget::subtractOneSecond()
{
    // 若全部等于0,则返回false
    if(hms.second <= 0 && hms.minute == 0 && hms.hour == 0){
        return false;
    }
    // 秒钟减1
    hms.second--;
    if(hms.second < 0){
        hms.minute--;
        hms.second = 59;
        if(hms.minute < 0){
            hms.hour--;
            hms.minute = 59;
        }
    }
    return true;
}

void Widget::do_timer_timeout()
{
    bool retBool = this->subtractOneSecond();
    if(!retBool){
        // 停止timer
        m_timer->stop();
        return;
    }
    ui->lcdHour->display(hms.hour);
    ui->lcdMinute->display(hms.minute);
    ui->lcdSecond->display(hms.second);

}

// 开始
void Widget::on_btnStart_clicked()
{
    m_timer->start();
    QTime tm = ui->timeEdit->time();
    this->hms.hour = tm.hour();
    this->hms.minute = tm.minute();
    this->hms.second = tm.second();
    qDebug("Hour=%d", tm.hour());
    qDebug("Minute=%d", tm.minute());
    qDebug("Second=%d", tm.second());
}
// 停止
void Widget::on_btnStop_clicked()
{
    m_timer->stop();
}
  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt 中,可以使用 QTimer 类来创建定时器,并且在 Windows 平台下,Qt 也支持使用 Win32 API 中的 SetTimer 函数来创建定时器。 以下是使用 QTimer 类创建定时器的示例代码: ```cpp QTimer *timer = new QTimer(this); connect(timer, &QTimer::timeout, this, &MyClass::onTimerTimeout); timer->start(1000); // 每隔1秒触发一次定时器 ``` 在上面的代码中,首先创建了一个 QTimer 对象,然后使用 connect 函数将定时器的 timeout 信号连接到 MyClass 类中的 onTimerTimeout 槽函数。最后,调用 start 函数启动定时器,并设置定时器的时间间隔为 1000 毫秒,即每隔1秒触发一次定时器。 如果想要使用 Win32 API 中的 SetTimer 函数来创建定时器,可以按照以下步骤操作: 1. 在 Qt 的 .pro 文件中添加以下语句,以链接 Windows 平台下的 Winmm 库: ``` LIBS += -lwinmm ``` 2. 在类的头文件中声明定时器的 ID: ```cpp #define MY_TIMER_ID 1 ``` 3. 在类的构造函数中使用 SetTimer 函数创建定时器: ```cpp SetTimer(reinterpret_cast<HWND>(winId()), MY_TIMER_ID, 1000, nullptr); ``` 在上面的代码中,使用了 winId 函数获取当前窗口的句柄,然后将其转换为 HWND 类型,作为 SetTimer 函数的第一个参数。第二个参数是定时器的 ID,可以自定义一个整数值。第三个参数是定时器的时间间隔,以毫秒为单位。第四个参数是定时器回调函数的指针,可以为 nullptr。 4. 在类中实现定时器回调函数: ```cpp void MyClass::onTimerTimeout() { // 定时器回调函数的实现代码 } ``` 在回调函数中,可以编写定时器触发后需要执行的代码。可以在上面的 QTimer 示例代码中使用相同的方式来连接定时器的 timeout 信号与槽函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值