Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. How to reset the time on x-axis of a graph?
Forum Updated to NodeBB v4.3 + New Features

How to reset the time on x-axis of a graph?

Scheduled Pinned Locked Moved Solved General and Desktop
20 Posts 4 Posters 3.6k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • P Offline
    P Offline
    pj0909
    wrote on last edited by pj0909
    #1

    Hello All,
    I have two push buttons (Start time and Reset) and a widget (promoted to QCustomPlot) in my form.ui. The graph has time displayed on x-axis and it keeps on sliding towards left like real time data plot. When I press start time button, the value of x-axis sets to 0 and moves continuously based on the time elapsed. When I push the reset button the graph starts again from zero and x-axis keeps on sliding based on the time elapsed. When I press both the buttons for the first time it works good that is it starts the x-axis from zero. Till here it works good.
    After pressing the buttons for the first time, when I try for the second time none of the button sets the value on x-axis to zero and the graph keeps on displaying the time elapsed since the button is pressed for the first time. Below is my code, please guide me on this.

    My source code:

     void Form::on_pushButtonStartTime_clicked()
    {
        connect(&dataTimer, SIGNAL(timeout()), this, SLOT(realtimeDataSlot())); // QTimer dataTimer declared in header file
        dataTimer.start(0);
    }
    
    void Form::on_pushButtonReset_clicked()
    {
        connect(&dataTimer, SIGNAL(timeout()), this, SLOT(resetTime()));
        dataTimer.start(0);
    
    }
    
    void Form::realtimeDataSlot()
    {
        static QTime time(QTime::currentTime());
        double key = time.elapsed()/1000.0; // time elapsed since start in seconds
        //  x-axis range scroll with the data 
        ui->customPlot->xAxis->setRange(key, 6, Qt::AlignRight);
        ui->customPlot->replot();
    }
    
    void Form::resetTime()
    {
        static QTime time(QTime::currentTime());
        double key=time.elapsed()/1000.0;
       
        ui->customPlot->xAxis->setRange(key, 6, Qt::AlignRight);
        ui->customPlot->replot();
    }
    

    Can anyone please guide me on why the above code works only for the first time and not for the consecutive pressing of the buttons.

    Thank you for your time and knowledge.

    1 Reply Last reply
    0
    • VRoninV Offline
      VRoninV Offline
      VRonin
      wrote on last edited by
      #2

      Take a look at http://doc.qt.io/qt-5/qelapsedtimer.html

      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
      ~Napoleon Bonaparte

      On a crusade to banish setIndexWidget() from the holy land of Qt

      P 1 Reply Last reply
      0
      • P Offline
        P Offline
        pj0909
        wrote on last edited by
        #3

        I found the solution :)

        1 Reply Last reply
        0
        • VRoninV VRonin

          Take a look at http://doc.qt.io/qt-5/qelapsedtimer.html

          P Offline
          P Offline
          pj0909
          wrote on last edited by
          #4

          @VRonin Thank you for the reply. I found the solution but I didn't use QElapsedTimer.

          1 Reply Last reply
          0
          • VRoninV Offline
            VRoninV Offline
            VRonin
            wrote on last edited by
            #5

            Could you share your solution so people googling the problem in the future will be able to find the answer

            "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
            ~Napoleon Bonaparte

            On a crusade to banish setIndexWidget() from the holy land of Qt

            1 Reply Last reply
            0
            • P Offline
              P Offline
              pj0909
              wrote on last edited by
              #6

              Solution to my problem -

              1. I defined time as global variable and not local variable (as per the above code).
              2. In the slot definition of push buttons I started the code with time.start() which is missing in the code above.

              And it works...

              1 Reply Last reply
              0
              • VRoninV Offline
                VRoninV Offline
                VRonin
                wrote on last edited by
                #7

                For future readers:
                I still suggest using QElapsedTimer as a member variable and calling start() to reset it

                "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                ~Napoleon Bonaparte

                On a crusade to banish setIndexWidget() from the holy land of Qt

                1 Reply Last reply
                2
                • halimaH Offline
                  halimaH Offline
                  halima
                  wrote on last edited by
                  #8
                  This post is deleted!
                  1 Reply Last reply
                  0
                  • halimaH Offline
                    halimaH Offline
                    halima
                    wrote on last edited by
                    #9

                    @VRonin I have the same problem, I'm trying to use QElapsedTimer with QChart, can you help me to do that please. This is my code :

                    classe.cpp

                    void MaClasse::updateChart(){
                         ElapsedTimer .start(); //global variable
                         chart_1->chart()->axes(Qt::Horizontal).back()->setMin(ElapsedTimer .elapsed());
                        chart_1->chart()->axes(Qt::Horizontal).back()->setMax(ElapsedTimer .elapsed()+10);
                     chart_1->series()[0].serie->replace(buffer_0);
                     QApplication::processEvents();
                    }
                    
                    jsulmJ 1 Reply Last reply
                    0
                    • VRoninV Offline
                      VRoninV Offline
                      VRonin
                      wrote on last edited by
                      #10

                      What is not working?

                      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                      ~Napoleon Bonaparte

                      On a crusade to banish setIndexWidget() from the holy land of Qt

                      halimaH 1 Reply Last reply
                      0
                      • VRoninV VRonin

                        What is not working?

                        halimaH Offline
                        halimaH Offline
                        halima
                        wrote on last edited by
                        #11

                        @vronin My code note working

                        jsulmJ 1 Reply Last reply
                        0
                        • halimaH halima

                          @vronin My code note working

                          jsulmJ Online
                          jsulmJ Online
                          jsulm
                          Lifetime Qt Champion
                          wrote on last edited by
                          #12

                          @halima said in How to reset the time on x-axis of a graph?:

                          My code note working

                          That's clear.
                          What EXACTLY is not working?

                          https://forum.qt.io/topic/113070/qt-code-of-conduct

                          halimaH 1 Reply Last reply
                          0
                          • jsulmJ jsulm

                            @halima said in How to reset the time on x-axis of a graph?:

                            My code note working

                            That's clear.
                            What EXACTLY is not working?

                            halimaH Offline
                            halimaH Offline
                            halima
                            wrote on last edited by halima
                            #13

                            @jsulm The max of XAxis is always 09:33:18 it's not moving when a new Data added.
                            This is my current code : (this function is called with a Timer every 200ms)

                             QVector<QPointF> m_buffer =  chart_1->series()[0].serie->pointsVector();//currentSerie.serie->pointsVector() ;
                                if(m_buffer.length() > 2000){
                                    m_buffer.remove(0);
                                }
                            
                                ElapsedTimer .start(); //global variable
                                chart_1->chart()->axes(Qt::Horizontal).back()->setMin(ElapsedTimer .elapsed());
                                chart_1->chart()->axes(Qt::Horizontal).back()->setMax(ElapsedTimer .elapsed()+10);
                            
                                m_buffer.append(QPointF(QDateTime::currentDateTime().toMSecsSinceEpoch(), qrand() % ((10 + 1) - 1) + 1));
                                chart_1->series()[0].serie->replace(m_buffer);
                            
                                QApplication::processEvents();
                            

                            0_1564558471618_56a63da9-23b5-43fd-8424-c1285ffd5185-image.png

                            1 Reply Last reply
                            0
                            • halimaH halima

                              @VRonin I have the same problem, I'm trying to use QElapsedTimer with QChart, can you help me to do that please. This is my code :

                              classe.cpp

                              void MaClasse::updateChart(){
                                   ElapsedTimer .start(); //global variable
                                   chart_1->chart()->axes(Qt::Horizontal).back()->setMin(ElapsedTimer .elapsed());
                                  chart_1->chart()->axes(Qt::Horizontal).back()->setMax(ElapsedTimer .elapsed()+10);
                               chart_1->series()[0].serie->replace(buffer_0);
                               QApplication::processEvents();
                              }
                              
                              jsulmJ Online
                              jsulmJ Online
                              jsulm
                              Lifetime Qt Champion
                              wrote on last edited by
                              #14

                              @halima said in How to reset the time on x-axis of a graph?:

                              void MaClasse::updateChart(){
                              ElapsedTimer .start();

                              Why do you start the timer here?!

                              https://forum.qt.io/topic/113070/qt-code-of-conduct

                              1 Reply Last reply
                              1
                              • halimaH Offline
                                halimaH Offline
                                halima
                                wrote on last edited by halima
                                #15

                                I'm using two timers :

                                //first timer to execute slot 
                                QTimer *timer 
                                 connect(timer,&QTimer::timeout,this,&CL_SubWin_Chart::updateChart);
                                timer->start(200);
                                //second timer to update XAxis
                                void MaClasse::updateChart(){
                                 QElapsedTimer ElapsedTimer;
                                ElapsedTimer .start();
                                
                                chart_1->chart()->axes(Qt::Horizontal).back()->setMin(ElapsedTimer .elapsed());
                                chart_1->chart()->axes(Qt::Horizontal).back()->setMax(ElapsedTimer .elapsed()+10);
                                ...
                                }
                                

                                But the xAxis not move!

                                jsulmJ 1 Reply Last reply
                                0
                                • halimaH halima

                                  I'm using two timers :

                                  //first timer to execute slot 
                                  QTimer *timer 
                                   connect(timer,&QTimer::timeout,this,&CL_SubWin_Chart::updateChart);
                                  timer->start(200);
                                  //second timer to update XAxis
                                  void MaClasse::updateChart(){
                                   QElapsedTimer ElapsedTimer;
                                  ElapsedTimer .start();
                                  
                                  chart_1->chart()->axes(Qt::Horizontal).back()->setMin(ElapsedTimer .elapsed());
                                  chart_1->chart()->axes(Qt::Horizontal).back()->setMax(ElapsedTimer .elapsed()+10);
                                  ...
                                  }
                                  

                                  But the xAxis not move!

                                  jsulmJ Online
                                  jsulmJ Online
                                  jsulm
                                  Lifetime Qt Champion
                                  wrote on last edited by
                                  #16

                                  @halima But why do you need this ElapsedTimer which you start inside updateChart()?
                                  You will always get more or less same value from elapsed() I think.

                                  https://forum.qt.io/topic/113070/qt-code-of-conduct

                                  halimaH 1 Reply Last reply
                                  1
                                  • jsulmJ jsulm

                                    @halima But why do you need this ElapsedTimer which you start inside updateChart()?
                                    You will always get more or less same value from elapsed() I think.

                                    halimaH Offline
                                    halimaH Offline
                                    halima
                                    wrote on last edited by halima
                                    #17

                                    @jsulm you're right it works without this timer but I do this to update xAxis values because I need to have a real time ploting .

                                    The chart serie start like this :
                                    0_1564559898602_430bcb87-96b0-4138-973d-2d55d598535f-image.png

                                    The final Chart, New Data after09:58:56 is not displayed!
                                    0_1564559974416_a6a036cc-e091-4933-aa4a-4951900e267e-image.png

                                    jsulmJ 1 Reply Last reply
                                    0
                                    • halimaH halima

                                      @jsulm you're right it works without this timer but I do this to update xAxis values because I need to have a real time ploting .

                                      The chart serie start like this :
                                      0_1564559898602_430bcb87-96b0-4138-973d-2d55d598535f-image.png

                                      The final Chart, New Data after09:58:56 is not displayed!
                                      0_1564559974416_a6a036cc-e091-4933-aa4a-4951900e267e-image.png

                                      jsulmJ Online
                                      jsulmJ Online
                                      jsulm
                                      Lifetime Qt Champion
                                      wrote on last edited by
                                      #18

                                      @halima I suggest to move

                                      QElapsedTimer ElapsedTimer;
                                      

                                      to your MaClasse (as member variable)
                                      And this to the constructor:

                                      ElapsedTimer .start();
                                      

                                      then it should work.

                                      https://forum.qt.io/topic/113070/qt-code-of-conduct

                                      halimaH 1 Reply Last reply
                                      2
                                      • jsulmJ jsulm

                                        @halima I suggest to move

                                        QElapsedTimer ElapsedTimer;
                                        

                                        to your MaClasse (as member variable)
                                        And this to the constructor:

                                        ElapsedTimer .start();
                                        

                                        then it should work.

                                        halimaH Offline
                                        halimaH Offline
                                        halima
                                        wrote on last edited by halima
                                        #19

                                        @jsulm i did this and it's still not working :(

                                        //constructor
                                        MaClasse::MaClasse(){   
                                            ElapsedTimer .start();
                                        }
                                        
                                        //slot
                                        void void MaClasse::updateChart(){
                                        
                                            QVector<QPointF> m_buffer =  chart_1->series()[0].serie->pointsVector();
                                            if(m_buffer.length() > 2000){       
                                                m_buffer.remove(0);
                                            }
                                        
                                            chart_1->chart()->axes(Qt::Horizontal).back()->setMin(ElapsedTimer .elapsed());
                                            chart_1->chart()->axes(Qt::Horizontal).back()->setMax(ElapsedTimer .elapsed()+10);
                                        
                                            m_buffer.append(QPointF(QDateTime::currentDateTime().toMSecsSinceEpoch(), qrand() % ((10 + 1) - 1) + 1));
                                            chart_1->series()[0].serie->replace(m_buffer);
                                        
                                            QApplication::processEvents();
                                        }
                                        
                                        1 Reply Last reply
                                        0
                                        • halimaH Offline
                                          halimaH Offline
                                          halima
                                          wrote on last edited by
                                          #20

                                          I solved the problem with doing this :

                                           chart_1->chart()->axes(Qt::Horizontal).back()->setMin(QDateTime::fromMSecsSinceEpoch(m_buffer[0].x()));
                                              chart_1->chart()->axes(Qt::Horizontal).back()->setMax(QDateTime::currentDateTime().addSecs(1));
                                          

                                          it works perfectly.
                                          Thank you guys! @jsulm @VRonin

                                          1 Reply Last reply
                                          2

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved