我正在构建一个简单的游戏,向用户显示倒计时,从1:00开始,倒数到零。到0:00时,我要显示一条消息,如“时间到了!”。
我目前有一个QTimer和一个QTime对象(QTime从00:01:00开始)
QTimer *timer=new QTimer();
QTime time{0,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。我还以为也许我可以添加第二个QTimer,它在1分钟后超时,但是我不确定两个QTimer对象是否会在完全相同的时间开始,因此1分钟的超时将恰好在QTime对象为0时发生: 00。
有没有办法向同一QTimer对象添加第二次超时(每秒超时一次以更新屏幕上的倒数,然后在1分钟后第二次超时以结束游戏?我怀疑答案是“否”,但是在那种情况下,最好的方法是什么?(如果我的选择都无效,还有更好的方法吗?)。
答案 0 :(得分:2)
第一个问题的答案是否定的-dict1 = [{'12/21/18': 0,'12/22/18': 0,'12/23/18': 1,'12/24/18': 1},
{'12/21/18': 1,'12/22/18': 1,'12/23/18': 0,'12/24/18': 1},
{'12/21/18': 0,'12/22/18': 1,'12/23/18': 0,'12/24/18': 0},
{'12/21/18': 1,'12/22/18': 0,'12/23/18': 1,'12/24/18': 1}]
df1 = pd.DataFrame(dict1, index= ['AAPL','CSCO','GE','MSFT' ])
dict2 = [{'Ticker': 'AAPL','Date': '12/23/18'},
{'Ticker': 'AAPL','Date': '12/24/18'},
{'Ticker': 'CSCO','Date': '12/22/18'},
{'Ticker': 'CSCO','Date': '12/24/18'},
{'Ticker': 'GE', 'Date': '12/22/18'},
{'Ticker': 'MSFT','Date': '12/24/18'}]
df2 = pd.DataFrame(dict2)
支持单个超时(或单个指定的时间间隔,如果它不以单次模式运行)。
第二个问题的答案是-最好的方法是可能可行的最简单方法。使用单个QTimer,并在您的QTimer
方法中包含一个updateCountdown()
语句,以在倒数最终达到零时做一些不同的事情。 (顺便说一句,您实际上并不需要使用if
对象来表示倒数;您可以轻松地使用从60开始并递减直到达到0的QTime
)
为什么这个更好/更简单?您可以改用两个int
对象,但随后您必须担心保持它们同步-也许现在这没什么大不了,但是当您想在游戏中添加“暂停”按钮时会发生什么,或要添加时间红利给播放器10秒钟的播放时间?突然之间,您的60秒计时器将不再做正确的事,在任何情况下都无法正确停止并重新启动它。
If语句便宜,并且易于理解/控制/调试;所以您最好使用一个。