Qt如何使用startTimer()API启动计时器?

时间:2015-07-29 12:52:46

标签: c++ qt timer qtimer

我在完成后使用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线程中的两个不同的类中运行。我该如何杀死它?

3 个答案:

答案 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)

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

答案 2 :(得分:0)

  1. 您需要确保特定的timerEvent调用与您的计时器相关。

  2. QBasicTimer是一个围绕计时器ID的好方便包装器,您可以使用它来代替原始ID。

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

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

  5. 您没有通过显式使用剩余时间计数器的16位无符号整数来保存任何内容。只需使用int。

  6. 明确提及变量名称类型的风格是,如果您的雇主没有强迫您使用它,请不要使用它。编译器的工作是跟踪这些事情,而不是你的事情,而且不是C和winapi,如果你没有这样做,事情有时会变得毛茸茸。

  7. 因此:

    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();
        }
      }
    };