1

完成后,我会更新倒计时计时器,但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 线程的两个不同的类中运行。我将如何杀死它?

4

3 回答 3

5

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);
    }
}
于 2015-07-29T13:01:26.147 回答
0

如果您使用QTimeror QBasicTimer,您可以在其中一个上调用 stop() 。

于 2015-07-29T12:59:43.403 回答
0
  1. 您需要确保特定timerEvent调用与您的计时器相关。

  2. QBasicTimer是一个非常方便的定时器 id 包装器,您可以使用它来代替原始 id。

  3. 可以潜在重用的类成员中的静态变量是令人讨厌的错误的来源。

  4. isWarmupStarted是多余的,它的值与 相同m_warmupRemaining > 0

  5. 通过显式使用 16 位无符号整数作为剩余时间计数器,您不会保存任何内容。只需使用一个int。

  6. 在变量名中明确提到类型的风格是,如果你的雇主没有强迫你使用它,那就不要使用它。跟踪这些事情是编译器的工作,而不是你的工作,也不是 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();
    }
  }
};
于 2015-07-29T13:32:56.890 回答