Qt如何杀死一个定时器开始使用startTimer() API
Qt How to kill a timer started using startTimer() API?
我使用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("nnnnn WARM UP TIMER RUNNING nnnnn");
killTimer(warmUpTimerID);
}
}
如果有帮助的话。我在同一个GUI线程的两个不同类中运行了两个这样的计时器。我该如何杀死它?
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("nnnnn WARM UP TIMER RUNNING nnnnn");
killTimer(warmUpTimerID);
}
}
如果您使用QTimer
或QBasicTimer
,您可以在其中一个上调用stop()
-
您需要确保特定的
timerEvent
调用与您的计时器相关。 -
QBasicTimer
是一个很好的方便的定时器id包装,您可以使用它来代替原始id。 -
类成员中的静态变量可以被潜在地重用,这是令人讨厌的bug的来源。
-
isWarmupStarted
是多余的,它的值与m_warmupRemaining > 0
相同。 -
通过显式地使用16位无符号整数作为剩余时间计数器,您不会节省任何东西。
-
在变量名中显式提到类型的样式是,如果你的雇主没有强迫你使用它,就不要使用它。跟踪这些东西是编译器的工作,不是你的,也不是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();
}
}
};
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 根据用户输入用字母填充矢量,并将"开始"和"结束"放在四肢
- 如何从头开始创建 avi 文件?
- 为什么 -mmacosx-version-min=10.10 不阻止使用标记为从 10.11 开始的函数?
- 自一周开始以来的秒数?
- 一旦双簧管录制开始,主 UI 线程就会被阻止
- GStreamer在开始任何播放之前进行搜索
- 使 std::fstream 写入文件末尾,但从头开始读取
- 如何以毫秒为单位获取开始时间和 now() 之间的毫秒差异(以 C++为单位?
- 哪个C++规范开始支持 std::vector
- 如何继续读取不同功能中的文件,而不是从头开始再次读取文件?
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- 如何在调试中通过传递引用开始
- 如何使用 picojson.h 在 c++ 中从头开始创建 json 对象
- 从特定键开始遍历地图
- 列表的有效性在插入后开始迭代器
- 尝试从头开始实现Leetcode的FizzBuzz多线程问题。收到"libc++abi.dylib: terminating"错误
- 试图修复一个错误,该错误不会让我开始编程其余部分
- 甚至在开始执行之前出现分段错误
- Qt如何杀死一个定时器开始使用startTimer() API