我正在尝试在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");
}
答案 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();
}