Qt C++:如何添加一个简单的倒计时器?

3
我是一名新手学习Qt C++,但从我在网上找到的少量资源中,没有办法提取我需要添加倒计时计时器的部分。我不想添加任何按钮或其他功能,只需要一个计时器从1:00开始计时并递减直到达到0:00,此时我需要显示某种消息,告诉用户时间已经用完。我认为将一个标签添加到窗体以显示计时器可能是一种简单的方法(但我现在不确定是否正确)。
到目前为止,我创建了一个新的Qt应用程序项目,在我的主窗体中添加了一个标签,并从http://doc.qt.io/archives/qt-4.8/timers.html中获取了一些计时器代码添加到mainwindow.cpp中。
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //Initialize "countdown" label text
    ui->countdown->setText("1:00");

    //Connect timer to slot so it gets updated
    timer = new QTimer();
    connect(timer, SIGNAL(timeout()), this, SLOT(updateCountdown()));

    //It is started with a value of 1000 milliseconds, indicating that it will time out every second.
    timer->start(1000);
}

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

void MainWindow::updateCountdown()
{
    //do something along the lines of ui->countdown->setText(....);
}

在mainwindow.h文件中,我添加了一个公共属性QTimer *timer;,同时添加了一个私有槽void updateCountdown();
但是我不确定接下来该怎么做。我认为下一步应该是每秒减少计时器并在“倒计时”标签上显示(这将在updateCountdown槽中完成),但我找不到方法。 我也不确定如何在倒计时到0:00时触发消息(可能在QFrame上)。
1个回答

5
根据QTimer文档,在你的配置中,函数updateCountdown()每1秒钟调用一次。因此,您应该在每次调用此函数时从计时器中减去1秒,并更新UI。目前,您没有将时间存储在任何地方,因此我建议您暂时将其作为全局变量添加,例如QTime time(0, 1, 0)QTime文档

然后在updateCountdown()内部调用time.addSecs(-1);,然后调用ui->countdown->setText(time.toString("m:ss"));。 这样可以轻松检查是否是“0:00”,然后执行其他操作。

希望这能有所帮助。


2
也许可以将其作为成员变量,而不是使用_global_? - TrebledJ
1
@TrebuchetMS 是的,我只是在考虑为测试目的使用全局变量。此外,在计时器完成其目标后停止/删除计时器,以便不浪费 CPU 时间也是不错的选择。 - Lucas Mota
我已经尝试过这个,但是我一定做错了什么,因为我设置了计时器为1:00,但没有其他反应。在头文件中,我添加了一个QTime *time = new QTime(0, 1, 0)作为公共属性(以及我已经拥有的QTimer *timer)。在cpp文件中,我在updateCountdown()槽中添加了这两行代码:time->addSecs(-1); ui->countdown->setText(time->toString("m:ss"));。似乎我漏掉了什么,因为似乎什么都没有发生。我还尝试过只在头文件中声明一个QTime* time,然后在cpp文件中使用time = new QTime(0, 1, 0);。我还没有尝试“当它到达0:00”的部分。 - Floella
1
你可以通过打印 time->toString("m:ss") 来检查是否每秒实际调用了 updateCountdown()。如果它被调用并且输出正确,那么可能是 UI 没有正确更新。 - Lucas Mota
1
终于搞定了,但我无法使用QTime构造函数。因此,我在头文件中声明了一个公共的QTime time对象,然后在MainWindow构造函数中使用time.setHMS(0,1,0)进行初始化。然后,像@LucasMota所说的那样,在我的updateCountdown()插槽中调用time=time.addSecs(-1)ui->countdown->setText(time.toString("m:ss"))。我还将标签初始化更改为在MainWindow构造函数中的ui->countdown->setText(time.toString("m:ss"))。谢谢。 - Floella

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接