How to pause and resume a Qtimer ?



  • Hello,

    I need some help on the usage of Qtimer.

    I work with Qt 5.0.2 and here my problem :

    I am trying to develop a Timer, and the interface is simple :

    There is just 2 button : the button "Start", to launch the timer, and the "Pause" Button, and a QtimeEdit to display the time.

    This screenshot shows how it looks like : http://img834.imageshack.us/img834/1046/5ks6.png

    The problem is that the pause function doesn't work. I have read all the documentation about Qtimer here : http://harmattan-dev.nokia.com/docs/library/html/qt4/qtimer.html and here : http://qt.developpez.com/doc/5.0-snapshot/qtimer/ , but no result.

    This is the source code I have : (I put only what is needed)

    @ // Creation of the Buttons and the time area
    void MainWindow::createBottom()
    {

    bottom = new QWidget();
    
    play = new QPushButton("Launch",this);
    pause = new QPushButton("Pause",this);
    play->setDisabled(false);
    pause->setDisabled(true);
    timeEdit = new QTimeEdit(this);
    timeEdit->setDisplayFormat("mm:ss");
    
    layout->addWidget(play);
    layout->addWidget(pause);
    layout->addWidget(timeEdit );
    bottom->setLayout(layout);
    
    connect(play, SIGNAL(clicked()), this, SLOT(startSimulation()));
    connect(pause, SIGNAL(clicked()), this, SLOT(pauseSimulation()));
    

    }

    // to resume the timer where is was stopped
    void MainWindow::resumeSimulation()
    {
    timer->blockSignals( false );
    pause->setText("Pause");
    pause->disconnect(SIGNAL(clicked()));
    connect(pause, SIGNAL(clicked()), this, SLOT(pauseSimulation()));
    paused = false;

    timer->start();
    int timeOfPause = time->restart();
    int timeTotal = timeOfPause + timeElapsed;
    time->addMSecs(-timeTotal);
    

    }

    // to Start the timer
    void MainWindow::pauseSimulation()
    {
    timer->blockSignals(true);
    pause->setText("Resume");
    timer->stop();
    play->setDisabled(false);
    //pause->setDisabled(true);
    pause->disconnect(SIGNAL(clicked()));

    connect(pause, SIGNAL(clicked()), this, SLOT(resumeSimulation())); 
    paused = true;
    

    }

    // to Start the timer from zero.
    void MainWindow::startSimulation()
    {

    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this , SLOT(updateTime()));
    timer->start(500);
    play->setDisabled(true);
    
    pause->setDisabled(false);
    

    }

    void MainWindow::updateTime()
    {
    if(time == NULL)
    {
    time = new QTime(0,0,0,0);
    time->start();
    }
    //timeEdit->setTime(QTime::fromS(time->elapsed()));
    //time = &(time->addMSecs(1000));
    if(hasRestart)
    {
    time->restart();
    time->addMSecs(-timeElapsed);
    hasRestart = false;
    }
    else
    {
    timeElapsed =+ time->elapsed();
    }
    int seconds = 0;
    int minutes = 0;
    int hours = 0;

    if(!paused)
    {
            seconds = (timeElapsed/1000)`;
            minutes = (timeElapsed/60000)`;
            hours =  (timeElapsed/3600000)$;
            std::cout << "Test : " << hours << ":" << minutes << ":" << seconds << std::endl;
            timeEdit->setTime(QTime(0,minutes,seconds,0));
            timeEdit->update();
    }
    

    }@

    When I push the Start button, the timer starts well, but when I push "Pause" it only pause it on the graphic interface, but when I resume, it shows the present time as if it hadn't paused.

    For instance :

    I start.
    I pause at 00:05. It blocks apparently the timer.
    I wait for 10 seconds. I resume the timer, it shows 00:15 instead of 00:06

    How could I fix that ?

    Thank you !

    EDIT : I have added the updateTime() method.


  • Lifetime Qt Champion

    Hi and welcome to devnet,

    You first problem is that you create a new timer each time you call startSimulation. You only need to create it once and re-use it.

    Also, why do you disconnect and reconnect pause ?

    Why use blockSignal on timer ? If you stop it, timeout should not get called

    Hope the questions will help



  • Thanks, but how could I fix this out ?


  • Lifetime Qt Champion

    Don't create a new timer in startSimulation. Create and setup your timer in the constructor


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.