我写了一个c ++ qt程序。我尝试使用lcdnumber
实现一个倒数计时器,并且在slot函数中,我使用了一个qtime
对象来跟踪当前时间,并使用了三个int h,m,s
来标记倒数时间。>
我认为s-time.second
应该是显示时间的第二部分,而且事实总是显示为0。
如果我让它显示time.second
减去3({time.second-3
)这样的静态数字,那么它将起作用。
h,m,s
一直在变化吗?
我该怎么办?
QTime time = QTime::currentTime();
int s=time.second();
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
QTimer* timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(showTime(int)));
timer->start(10);
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::showTime(){
QTime time = QTime::currentTime();
int b=(s-time.second()+60)%60;
auto o=QTime(h,m,b,0);
QString timestr = o.toString("hh:mm:ss");
ui->lcdNumber->display(timestr);
}
···
答案 0 :(得分:0)
您可以使用两个计时器来实现此目的。启动第一个计时器以跟踪经过的时间。第二个用于跟踪剩余时间。
countdown = QTime(0, 1, 30); // one minute and thirty seconds
timer.start()
然后在计时器回调中,可以从countdown
中减去经过的时间,以获取剩余时间。
int elapsed_ms = timer.elapsed();
countdown.addMSecs( - elapsed_ms);
答案 1 :(得分:0)
感谢托马斯,问题得以解决。关键是使用double计时器。一个是qtimer,另一个是qelapsed计时器。 qtime组件用于将信号不断发送到插槽功能,并且在插槽功能中,int elapsed_ms = timer.elapsed(); countdown.addMSecs(-elapsed_ms)可以实现倒数计时器。 代码如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTime>
#include <QDate>
#include <QTimer>
#include <QDebug>
#include<QElapsedTimer >
QElapsedTimer etimer;
QTimer* timer = new QTimer();
auto countdown=QTime(0,1,30);
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
etimer.start();
connect(timer, SIGNAL(timeout()), this, SLOT(showTime()));
timer->start(10);
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::showTime(){
auto elapsed =etimer.elapsed();
auto c=countdown.addMSecs(-elapsed);
QString timestr = c.toString("hh:mm:ss.zzz"); //设置时间格式
ui->lcdNumber->display(timestr);
}