我在完成后使用timerEvent(QTimerEvent *e)
更新倒计时器我调用了killTimer(timerID)
但仍然调用timerEvent()
。
那么杀死它的正确方法是什么?
守则:
void MainWindow::timerEvent(QTimerEvent *e)
{
Q_UNUSED(e);
static uint16_t u16RemTime = MAX_WARMUP_TIME_IN_SECS;
if((true == isWarmUpStarted) && (u16RemTime > 0))
{
u16RemTime--;
objptrSplashScreen->SetTime(u16RemTime);
}
else
{
//Still running
qWarning("\n\n\n\n\n WARM UP TIMER RUNNING \n\n\n\n\n");
killTimer(warmUpTimerID);
}
}
如果有帮助的话。我有两个这样的计时器在同一个GUI线程中的两个不同的类中运行。我该如何杀死它?
答案 0 :(得分:4)
timerEvent
收到所有计时器的活动。为了使它们不同QTimerEvent
类有int timerId() const
方法。所以你的活动应该是这样的:
void MainWindow::timerEvent(QTimerEvent *e)
{
if (e->timerId() != warmUpTimerID)
return;
static uint16_t u16RemTime = MAX_WARMUP_TIME_IN_SECS;
if((true == isWarmUpStarted) && (u16RemTime > 0))
{
u16RemTime--;
objptrSplashScreen->SetTime(u16RemTime);
}
else
{
//Still running
qWarning("\n\n\n\n\n WARM UP TIMER RUNNING \n\n\n\n\n");
killTimer(warmUpTimerID);
}
}
答案 1 :(得分:0)
如果您使用QTimer
或QBasicTimer
,则可以在其中一个上调用stop()。
答案 2 :(得分:0)
您需要确保特定的timerEvent
调用与您的计时器相关。
QBasicTimer
是一个围绕计时器ID的好方便包装器,您可以使用它来代替原始ID。
可以重复使用的类成员中的静态变量是令人讨厌的错误的来源。
isWarmupStarted
是多余的,其值与m_warmupRemaining > 0
相同。
您没有通过显式使用剩余时间计数器的16位无符号整数来保存任何内容。只需使用int。
明确提及变量名称类型的风格是,如果您的雇主没有强迫您使用它,请不要使用它。编译器的工作是跟踪这些事情,而不是你的事情,而且不是C和winapi,如果你没有这样做,事情有时会变得毛茸茸。
因此:
class MainWindow : public QMainWindow {
Q_OBJECT
QSplashScreen * m_splashScreen;
QBasicTimer m_warmupTimer;
int m_warmupRemaining;
void timerEvent(QTimerEvent * ev) {
if (ev->timerId() != m_warmupTimer.timerId()) return;
// No need to call the empty QMainWindow::timerEvent(ev).
// All timerEvent implementations in public Qt classes are empty,
// to make your life easier.
if (m_warmupRemaining > 0) {
m_warmupRemaining --;
m_splashScreen->SetTime(m_warmupRemaining);
} else {
m_warmupTimer.stop();
}
}
};