QT定时器(开始/暂停)

时间:2015-06-11 06:55:27

标签: c qt timer

我正在尝试在Qt中实现一个计时器,我有一个开始/暂停(单个按钮)和一个重置按钮。当我单击开始按钮时,它启动计时器,按钮上的文本变为暂停,当我再次单击暂停时,文本变回开始,时间XX:XX:XX暂停,但是当我单击开始时计时器再次返回00:00:00(它清除计时器并从开始计数开始)。我不知道发生了什么以及如何阻止这种情况。

另一方面,重置按钮似乎工作正常。

我已经尝试纠正它,我发现的唯一工作方式是当按下按钮时我包括now = time(NULL);定时器以00:00:00开始。或者它保留系统时间的时间并以随机数开始。

非常感谢任何帮助。 对此给您带来的任何不便表示歉意。

IncDisplay::IncDisplay(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::IncDisplay),
    running(false),
    elapsed(0), s(0), m(0), h(0)
{

    connect(&timer, SIGNAL(timeout()), this, SLOT(updateDisplay()));
    time(&now);
    timer.start(10);
    ui->timer->display("00:00:00");
    updateDisplay();
}

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

void IncDisplay::updateDisplay()
{
    QTime timex = QTime::currentTime();
    QString text = timex.toString("hh:mm");

    ui->clock->display(text);

    if (running) {
        double sec = difftime(time(NULL), now);
        s = (int)sec % 60;
        m = (int)(sec / 60) % 60;
        h = (int)(sec / 3600) % 60;


        QString text = QString().sprintf("%02d:%02d:%02d", h, m, s);
        ui->timer->display(text);
    }
}

void IncDisplay::on_start_clicked()
{
    running = !running;

    if (running) {
        now = time(NULL);
        ui->start->setText("Pause");
    }
    else {
        ui->start->setText("Start");
    }
}

void IncDisplay::on_reset_clicked()
{
    running = false;
    elapsed = 0;
    ui->start->setText("Start");
    ui->timer->display("00:00:00");
}

1 个答案:

答案 0 :(得分:1)

我建议保留QTime对象的已用时间:

IncDisplay::IncDisplay(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::IncDisplay),
    elapsed(0, 0, 0), // a QTime object
    interval(10) // an interger containing timer interval
{
    connect(&timer, SIGNAL(timeout()), this, SLOT(onTimeout()));
    timer.start(interval);
    updateDisplay();
}

void IncDisplay::onTimeout()
{
    elapsed = elapsed.addMSecs(timer.interval());
    updateDisplay();
}

void IncDisplay::updateDisplay()
{
    ui->timer->display(elapsed.toString("hh:mm:ss"));
}

void IncDisplay::on_start_clicked()
{
    if (timer.isRunning())
    {
        timer.stop();
        ui->start->setText("Start");
    }
    else
    {
        timer.start(interval);
        ui->start->setText("Pause");        
    }
}

void IncDisplay::on_reset_clicked()
{
    timer.stop();
    ui->start->setText("Start");
    elapsed = QTime(0, 0, 0);
    updateDisplay();
}