QTimer:“多次超时”可能吗?

Posted

技术标签:

【中文标题】QTimer:“多次超时”可能吗?【英文标题】:QTimer: are "multiple timeouts" possible? 【发布时间】:2018-12-27 21:07:29 【问题描述】:

我正在构建一个简单的游戏,它会向用户显示倒计时,从 1:00 开始倒计时到零。到了 0:00 时,我想显示一条消息,例如“时间到了!”。

我目前有一个 QTimer 和一个 QTime 对象(QTime 从 00:01:00 开始)

QTimer *timer=new QTimer();
QTime time0,1,0;

在构造函数中,我将计时器设置为每 1 秒超时一次,并且它连接到一个更新屏幕倒计时的事件,该事件最初在 1:00 显示计时器:

connect(timer, SIGNAL(timeout()), this, SLOT(updateCountDown()));
timer->start(1000);
ui->countdown->setText(time.toString("m:ss"));

这是每 1 秒调用一次的槽:

void MainWindow::updateCountDown()
    time=time.addSecs(-1);
    ui->countDown->setText(time.toString("m:ss"));

现在我需要能够在 QTime 到达 0:00 时调用新方法。我不太热衷于在 updateCountdown 方法上添加if 来检查 QTime 是否在每秒 0:00。我还想也许我可以添加一个在 1 分钟超时的第二个 QTimer,但我不确定两个 QTimer 对象是否会在完全相同的时间启动,所以 1 分钟超时将恰好在 QTime 对象为 0 时发生: 00.

那么有没有办法向同一个 QTimer 对象添加第二次超时(每秒超时一次以更新屏幕上的倒计时,然后在 1 分钟后第二次超时以结束游戏?我怀疑答案将是“不”,但在这种情况下,最好的方法是什么?(如果我的选项都无效,有没有更好的方法呢?)。

【问题讨论】:

你为什么不使用两个不同的计时器? 据我了解,您希望每秒显示时间,如果时间用完,即达到0:00,则调用另一个函数。我是对的? @JesperJuhl 使用 2 个计时器是我想到的方法之一,但我不确定它们是否会同时启动(也许它们在不同的线程或其他一些特定于实现的东西上使它们在每个程序运行时以不同的方式启动)。 “我不太热衷于在 updateCountdown 方法上添加一个 if 来检查 QTime 是否在每秒 0:00。”为什么不?这就是你应该做的。 @Floella 正如 Nikos C 所指出的,正确的方法是验证。 【参考方案1】:

第一个问题的答案是否定的——QTimer 支持单个超时(或单个指定的时间间隔,如果它不是以单次模式运行)。

第二个问题的答案是——最好的方法是最简单的方法。使用单个 QTimer,并在您的 updateCountdown() 方法中包含 if 语句,以便在倒计时最终达到零时执行不同的操作。 (顺便说一句,您实际上并不需要使用 QTime 对象来表示倒计时;您可以轻松地使用从 60 开始并递减直到达到 0 的 int

为什么这更好/更简单?您可以改用两个QTimer 对象,但是您必须担心使它们保持同步——也许现在这没什么大不了的,但是当您想在游戏中添加“暂停”按钮时会发生什么,或者当你想添加一个时间奖励,让玩家有 10 秒的额外游戏时间?突然之间,您的 60 秒计时器将不再做正确的事情,并且在所有情况下都正确地停止和重新启动它会很痛苦。

If 语句很便宜,并且易于理解/控制/调试;所以你不妨使用一个。

【讨论】:

以上是关于QTimer:“多次超时”可能吗?的主要内容,如果未能解决你的问题,请参考以下文章

QTimer 线程亲和性

Pyqt5 Qtimer理解

python 多线程 QTimer实现多线程

2.6.4 Qtimer定时器介绍

QTimer 超时信号不发出

QGLWidget updateGL() 不随 QTimer 更新?