qt c++ 计时器 踩坑实录

目录

main.cpp

指针调用:

类调用踩坑实录

"countdownTimer.h"

"countdownTimer.cpp"


main.cpp

#include <QApplication>
#include <QLabel>
#include "CountdownTimer.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QLabel label;
    label.show();

    auto updateLabel = [&label](const QString &text) {
        label.setText(text);
    };

    int totalTime = 60000; // 设置倒计时为60秒
    CountdownTimer countdownTimer(updateLabel, totalTime);
    countdownTimer.start();

    return app.exec();
}

指针调用:

#include <QApplication>
#include <QLabel>
#include "CountdownTimer.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QLabel* label = new QLabel;  // label 是一个指针
    label->show();

    auto updateLabel = [label](const QString &text) {  // 使用捕获列表捕获label指针
        label->setText(text);  // 使用箭头操作符访问setText方法
    };

    int totalTime = 60000; // 设置倒计时为60秒
    CountdownTimer countdownTimer(updateLabel, totalTime);
    countdownTimer.start();

    int result = app.exec();
    delete label;  // 清理动态分配的内存
    return result;
}

类调用踩坑实录

如果在类里面调用,CountdownTimer不能是函数内变量,要写成类变量,否则函数结束,就被销毁了。计时器无效了。

    auto callback = std::bind(&Countwidget::updateLabel, this, std::placeholders::_1);
      int totalTime = 5000; // 设置倒计时为60秒
     countdownTimer=new CountdownTimer(callback, totalTime);
      countdownTimer->start();

"countdownTimer.h"

#ifndef COUNTDOWNTIMER_H
#define COUNTDOWNTIMER_H

#include <QObject>
#include <QTimer>
#include <functional>
#include <QString>

class CountdownTimer : public QObject
{
    Q_OBJECT

public:
    CountdownTimer(std::function<void(const QString&)> updateCallback, int totalTime, QObject *parent = nullptr);
    void start();

private:
    QTimer *timer;
    int remainingTime;
    std::function<void(const QString&)> updateCallback; // 回调函数代替直接 QLabel 操作

    void handleTimeout();
};

#endif // COUNTDOWNTIMER_H

"countdownTimer.cpp"

#include "countdownTimer.h"

CountdownTimer::CountdownTimer(std::function<void(const QString&)> updateCallback, int totalTime, QObject *parent) :
    QObject(parent), updateCallback(updateCallback), remainingTime(totalTime)
{
    timer = new QTimer(this);
    timer->setInterval(1000); // 设置定时器间隔
    connect(timer, &QTimer::timeout, this, &CountdownTimer::handleTimeout);
}

void CountdownTimer::start()
{
    timer->start();
}

void CountdownTimer::handleTimeout()
{
    if (remainingTime > 0) {
        // int minutes = remainingTime / 60000;
        int seconds = (remainingTime % (60000+1)) / 1000;
        // int milliseconds = remainingTime % 1000;

        // QString text = QString("%1:%2:%3")
        //                    .arg(minutes, 2, 10, QChar('0'))
        //                    .arg(seconds, 2, 10, QChar('0'))
        //                    .arg(milliseconds, 3, 10, QChar('0'));

  QString text = QString("%1").arg(seconds, 1, 10, QChar('0'));
  // QString text = QString("%1").arg(seconds, 2, 10, QChar('0'));//左边补0

        updateCallback(text); // 使用回调函数更新UI
        remainingTime -= 1000;
    } else {
        updateCallback("00:00:000"); // 通知结束
        timer->stop();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AI算法网奇

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

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

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

打赏作者

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

抵扣说明:

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

余额充值