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 display the result of an operation in incremental fashion strating from 0?
Forum Updated to NodeBB v4.3 + New Features

How to display the result of an operation in incremental fashion strating from 0?

Scheduled Pinned Locked Moved Unsolved General and Desktop
34 Posts 8 Posters 3.9k 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.
  • ODБOïO ODБOï

    @Santhoshpl said in How to display the result of an operation in incremental fashion strating from 0?:

    crash

    can you please show your code ?

    S Offline
    S Offline
    Santhoshpl
    wrote on last edited by Santhoshpl
    #9

    @LeLev please find the below code:

    void MainWindow::on_controlButton_clicked()
    {
    double num1 = ui->num1->value();
    double num2 = ui->num2->value();
    double product = num1 * num2;
    double currentDisplay=0;
    QTimer *timer = new QTimer();
    QObject::connect(timer, &QTimer::timeout,&{
    if(currentDisplay>=product){
    timer->stop();
    }
    ui->product->display(currentDisplay);
    QApplication::processEvents();
    if(currentDisplay<meetingCost)currentDisplay++;
    });
    timer->start(500);
    }
    }

    JonBJ 1 Reply Last reply
    0
    • S Santhoshpl

      @LeLev please find the below code:

      void MainWindow::on_controlButton_clicked()
      {
      double num1 = ui->num1->value();
      double num2 = ui->num2->value();
      double product = num1 * num2;
      double currentDisplay=0;
      QTimer *timer = new QTimer();
      QObject::connect(timer, &QTimer::timeout,&{
      if(currentDisplay>=product){
      timer->stop();
      }
      ui->product->display(currentDisplay);
      QApplication::processEvents();
      if(currentDisplay<meetingCost)currentDisplay++;
      });
      timer->start(500);
      }
      }

      JonBJ Online
      JonBJ Online
      JonB
      wrote on last edited by JonB
      #10

      @Santhoshpl
      It helps others if you put literal code in this forum's code markers.

      Meanwhile, I don't know, @Lelev writes

       QObject::connect(timer, &QTimer::timeout,[&](){
      

      while you write

      QObject::connect(timer, &QTimer::timeout,&{
      

      so do you know what you're doing there with your lambda? Is there any reason you change his code for this?

      Otherwise run under debugger and look at the context/stack trace when the crash occurs.

      1 Reply Last reply
      3
      • Christian EhrlicherC Offline
        Christian EhrlicherC Offline
        Christian Ehrlicher
        Lifetime Qt Champion
        wrote on last edited by
        #11

        @JonB said in How to display the result of an operation in incremental fashion strating from 0?:

        [&]

        Please take a c++ book about lambdas - you're passing by reference and it will therefore go out of scope...

        Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
        Visit the Qt Academy at https://academy.qt.io/catalog

        1 Reply Last reply
        6
        • G Gerd

          or..
          just add a
          QApplication::processEvents();

          right after

          ui->product->display(temp);

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

          @Gerd said in How to display the result of an operation in incremental fashion strating from 0?:

          QApplication::processEvents();

          This is an ugly work-around and should be avoided. It is better to program in asynchronous way instead of calling processEvents().

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

          1 Reply Last reply
          5
          • G Offline
            G Offline
            Gerd
            wrote on last edited by
            #13

            lol
            then you should tell the qt people to remove such examples from the examples in qt sources...

            J.HilkJ 1 Reply Last reply
            0
            • G Gerd

              lol
              then you should tell the qt people to remove such examples from the examples in qt sources...

              J.HilkJ Offline
              J.HilkJ Offline
              J.Hilk
              Moderators
              wrote on last edited by
              #14

              @Gerd said in How to display the result of an operation in incremental fashion strating from 0?:

              then you should tell the qt people to remove such examples from the examples in qt sources...

              you're right, it shouldn't be there, can you name/link such an example?


              Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


              Q: What's that?
              A: It's blue light.
              Q: What does it do?
              A: It turns blue.

              1 Reply Last reply
              0
              • G Offline
                G Offline
                Gerd
                wrote on last edited by
                #15

                Qt\5.12.6.src\qtbase\examples\widgets\dialogs\findfiles
                Qt\5.12.6.src\qtbase\examples\widgets\itemviews\pixelator
                Qt\5.12.6.src\qtbase\examples\widgets\painting\fontsampler

                JonBJ 1 Reply Last reply
                1
                • G Gerd

                  Qt\5.12.6.src\qtbase\examples\widgets\dialogs\findfiles
                  Qt\5.12.6.src\qtbase\examples\widgets\itemviews\pixelator
                  Qt\5.12.6.src\qtbase\examples\widgets\painting\fontsampler

                  JonBJ Online
                  JonBJ Online
                  JonB
                  wrote on last edited by
                  #16

                  @Gerd Can you supply these as clickable links to the on-line docs?

                  1 Reply Last reply
                  0
                  • G Offline
                    G Offline
                    Gerd
                    wrote on last edited by
                    #17

                    heres one of them:
                    findfiles

                    1 Reply Last reply
                    1
                    • G Offline
                      G Offline
                      Gerd
                      wrote on last edited by
                      #18

                      for these it isnt in the doc pages but in the sourcecode..
                      pixelator
                      fontsampler

                      J.HilkJ 1 Reply Last reply
                      1
                      • G Gerd

                        for these it isnt in the doc pages but in the sourcecode..
                        pixelator
                        fontsampler

                        J.HilkJ Offline
                        J.HilkJ Offline
                        J.Hilk
                        Moderators
                        wrote on last edited by
                        #19

                        @Gerd
                        Well these examples haven't been touched in years, are very basic but never the less badly designed.

                        One can redesign those examples, without the need for a processEvent calls, which will make them bigger (source code size).
                        But IMHO that's something that should be done.


                        Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                        Q: What's that?
                        A: It's blue light.
                        Q: What does it do?
                        A: It turns blue.

                        1 Reply Last reply
                        2
                        • ODБOïO ODБOï

                          hi
                          @Santhoshpl said in How to display the result of an operation in incremental fashion strating from 0?:

                          double num1 = ui->num1->value();
                          double num2 = ui->num2->value();
                          double product= num1*num2;
                          int temp=0;
                          for(int i = 0; i<product; i++){
                          temp++;
                          ui->product->display(temp);

                          you can use QTimer for that

                           double num1 = 10;
                              double num2 = 2;
                              double product = num1*num2;
                          
                              int currentDisplay=0; //<
                          
                              QTimer *timer = new QTimer();
                              QObject::connect(timer, &QTimer::timeout,[&](){
                                  if(currentDisplay>=product){
                                      timer->stop();
                                  }
                                  qDebug()<<currentDisplay; // ui->product->display(temp);
                                  if(currentDisplay<product)currentDisplay++;
                              });
                              timer->start(50);
                          
                          C Offline
                          C Offline
                          Colins2
                          wrote on last edited by
                          #20

                          @LeLev
                          I just read your response and it seemed what I need as well.
                          However, I just get a crash with this code:

                          I have been having the same problems as the OP (and everyone else, I guess)
                          This code snippet is just for testing messages written to a QPlainTextEdit widget, nothing else.

                          void MainWindow::writeLeft()
                          {
                              int32_t cnt = 100;
                              QString msg, cno;
                              QTimer *ltimer = new QTimer();
                          
                              do{
                                  QTextStream(&cno) << cnt;
                                  msg = ("Hello left no : "+ cno);
                                  //message has been constructed, stop the process and display it
                                  QObject::connect(ltimer, &QTimer::timeout,[&](){
                                      if(cnt > 0){
                                          ltimer->stop();
                                      }
                                  ui->memo1->appendPlainText(msg);
                                  });
                                  cno.clear();
                                  QThread::sleep(1);
                                  ltimer->start(10);
                                  cnt--;
                              }while(cnt > 0);
                          }
                          

                          If I remove the QTimer statements then I just get the whole lot dumped to the QPlainTextEdit in one go.

                          JonBJ ODБOïO 2 Replies Last reply
                          0
                          • C Colins2

                            @LeLev
                            I just read your response and it seemed what I need as well.
                            However, I just get a crash with this code:

                            I have been having the same problems as the OP (and everyone else, I guess)
                            This code snippet is just for testing messages written to a QPlainTextEdit widget, nothing else.

                            void MainWindow::writeLeft()
                            {
                                int32_t cnt = 100;
                                QString msg, cno;
                                QTimer *ltimer = new QTimer();
                            
                                do{
                                    QTextStream(&cno) << cnt;
                                    msg = ("Hello left no : "+ cno);
                                    //message has been constructed, stop the process and display it
                                    QObject::connect(ltimer, &QTimer::timeout,[&](){
                                        if(cnt > 0){
                                            ltimer->stop();
                                        }
                                    ui->memo1->appendPlainText(msg);
                                    });
                                    cno.clear();
                                    QThread::sleep(1);
                                    ltimer->start(10);
                                    cnt--;
                                }while(cnt > 0);
                            }
                            

                            If I remove the QTimer statements then I just get the whole lot dumped to the QPlainTextEdit in one go.

                            JonBJ Online
                            JonBJ Online
                            JonB
                            wrote on last edited by
                            #21

                            @Colins2
                            You are re-connecting the timer every time round the loop?

                            C 1 Reply Last reply
                            2
                            • C Colins2

                              @LeLev
                              I just read your response and it seemed what I need as well.
                              However, I just get a crash with this code:

                              I have been having the same problems as the OP (and everyone else, I guess)
                              This code snippet is just for testing messages written to a QPlainTextEdit widget, nothing else.

                              void MainWindow::writeLeft()
                              {
                                  int32_t cnt = 100;
                                  QString msg, cno;
                                  QTimer *ltimer = new QTimer();
                              
                                  do{
                                      QTextStream(&cno) << cnt;
                                      msg = ("Hello left no : "+ cno);
                                      //message has been constructed, stop the process and display it
                                      QObject::connect(ltimer, &QTimer::timeout,[&](){
                                          if(cnt > 0){
                                              ltimer->stop();
                                          }
                                      ui->memo1->appendPlainText(msg);
                                      });
                                      cno.clear();
                                      QThread::sleep(1);
                                      ltimer->start(10);
                                      cnt--;
                                  }while(cnt > 0);
                              }
                              

                              If I remove the QTimer statements then I just get the whole lot dumped to the QPlainTextEdit in one go.

                              ODБOïO Offline
                              ODБOïO Offline
                              ODБOï
                              wrote on last edited by ODБOï
                              #22

                              @Colins2 im not 100% sure what you need to do but see

                              
                                  int32_t cnt = 100;
                                  QString msg, cno;
                                  QTimer *ltimer = new QTimer();
                              
                                  //do{
                                  // QTextStream(&cno) << cnt;
                              
                                  //msg = ("Hello left no : "+ cno);
                              
                                  QObject::connect(ltimer, &QTimer::timeout,[&](){
                                      cnt--;
                                      if(cnt == 0){ // <
                                          ltimer->stop();
                                      }
                                      qDebug()<< ("Hello left no : " + QString::number(cnt));
                              
                                  });
                              
                                  cno.clear();
                                  //  QThread::sleep(1);
                                  ltimer->start(10);
                              
                                  //   }while(cnt > 0);
                              
                              JonBJ C 2 Replies Last reply
                              1
                              • ODБOïO ODБOï

                                @Colins2 im not 100% sure what you need to do but see

                                
                                    int32_t cnt = 100;
                                    QString msg, cno;
                                    QTimer *ltimer = new QTimer();
                                
                                    //do{
                                    // QTextStream(&cno) << cnt;
                                
                                    //msg = ("Hello left no : "+ cno);
                                
                                    QObject::connect(ltimer, &QTimer::timeout,[&](){
                                        cnt--;
                                        if(cnt == 0){ // <
                                            ltimer->stop();
                                        }
                                        qDebug()<< ("Hello left no : " + QString::number(cnt));
                                
                                    });
                                
                                    cno.clear();
                                    //  QThread::sleep(1);
                                    ltimer->start(10);
                                
                                    //   }while(cnt > 0);
                                
                                JonBJ Online
                                JonBJ Online
                                JonB
                                wrote on last edited by JonB
                                #23

                                @Colins2
                                Glancing only at @LeLev's latest post, this makes much more sense. Give it a go?!

                                1 Reply Last reply
                                0
                                • G Offline
                                  G Offline
                                  Gerd
                                  wrote on last edited by
                                  #24

                                  @J-Hilk
                                  I totally disagree with that. What you are doing here is to replace a simple loop routine with an overcomplicated timer driven solution.
                                  In such simple programs there is absolutly no needance for that.
                                  Keep it simple and its runs (fast)...

                                  1 Reply Last reply
                                  0
                                  • ODБOïO ODБOï

                                    @Colins2 im not 100% sure what you need to do but see

                                    
                                        int32_t cnt = 100;
                                        QString msg, cno;
                                        QTimer *ltimer = new QTimer();
                                    
                                        //do{
                                        // QTextStream(&cno) << cnt;
                                    
                                        //msg = ("Hello left no : "+ cno);
                                    
                                        QObject::connect(ltimer, &QTimer::timeout,[&](){
                                            cnt--;
                                            if(cnt == 0){ // <
                                                ltimer->stop();
                                            }
                                            qDebug()<< ("Hello left no : " + QString::number(cnt));
                                    
                                        });
                                    
                                        cno.clear();
                                        //  QThread::sleep(1);
                                        ltimer->start(10);
                                    
                                        //   }while(cnt > 0);
                                    
                                    C Offline
                                    C Offline
                                    Colins2
                                    wrote on last edited by
                                    #25

                                    @LeLev
                                    I don't think your solution is what I want.

                                    What I am trying to achieve is quite simple - or should be.

                                    I have a PlainTextEdit widget that I am using as a log output.
                                    At various times through different routines, I want to output a message.
                                    What happens is that I get no output until the end of the routine, which isn't much use.

                                    I just cobbled the above routine to try to get just the message output working. It has no real relevance to my project other than the method.
                                    My loop just created a message with the counter attached and I would expect it to print to the PlainTextEdit widget when called.
                                    It doesn't do that. Stepping through the code, the statement executes and then the loop continues but nothing appears in the edit field. At the end of the loop it all gets dumped in one go.

                                    Re. the QTimer, It's new to me. I've never had to use these types of function to get output on the screen.
                                    As Gerd says in his post, it should be such a simple thing to do but it appears not to be.

                                    jsulmJ 1 Reply Last reply
                                    0
                                    • JonBJ JonB

                                      @Colins2
                                      You are re-connecting the timer every time round the loop?

                                      C Offline
                                      C Offline
                                      Colins2
                                      wrote on last edited by
                                      #26

                                      @JonB
                                      The idea was to trigger the timer stop so that I could print the current message and then resume.
                                      I see what you mean though, it shouldn't be necessary to re-connect every time, just start and stop.

                                      JonBJ 1 Reply Last reply
                                      0
                                      • C Colins2

                                        @LeLev
                                        I don't think your solution is what I want.

                                        What I am trying to achieve is quite simple - or should be.

                                        I have a PlainTextEdit widget that I am using as a log output.
                                        At various times through different routines, I want to output a message.
                                        What happens is that I get no output until the end of the routine, which isn't much use.

                                        I just cobbled the above routine to try to get just the message output working. It has no real relevance to my project other than the method.
                                        My loop just created a message with the counter attached and I would expect it to print to the PlainTextEdit widget when called.
                                        It doesn't do that. Stepping through the code, the statement executes and then the loop continues but nothing appears in the edit field. At the end of the loop it all gets dumped in one go.

                                        Re. the QTimer, It's new to me. I've never had to use these types of function to get output on the screen.
                                        As Gerd says in his post, it should be such a simple thing to do but it appears not to be.

                                        jsulmJ Offline
                                        jsulmJ Offline
                                        jsulm
                                        Lifetime Qt Champion
                                        wrote on last edited by
                                        #27

                                        @Colins2 said in How to display the result of an operation in incremental fashion strating from 0?:

                                        At various times through different routines, I want to output a message.

                                        If I understand you correctly this will not happen in a loop in your main thread - is that correct?
                                        Is your current implementation with the loop just proof of concept (or an example)?
                                        As I explained already your loop is blocking the event loop that's why it behaves like it does.
                                        So, the question is: how are these messages generated and exposed?

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

                                        C 1 Reply Last reply
                                        1
                                        • C Colins2

                                          @JonB
                                          The idea was to trigger the timer stop so that I could print the current message and then resume.
                                          I see what you mean though, it shouldn't be necessary to re-connect every time, just start and stop.

                                          JonBJ Online
                                          JonBJ Online
                                          JonB
                                          wrote on last edited by JonB
                                          #28

                                          @Colins2
                                          It's not just that it shouldn't be necessary, your loop will create a brand new, duplicate connection each time round the loop. You will end up with hundreds of slots on the timer's signal.

                                          This code really shouldn't be difficult! Though I'm not offering to write, and I'm Python/PyQt anyway. You have to have something which allows the Qt event loop to run if you want to see the output come up as you go along. If your new data arrives from somewhere externally, you might raise a signal and have a slot to update your display. That will be happening within the Qt main event loop, so all will get updated as you go along.

                                          I see @jsulm is responding more to what you want, I'll leave it to him :)

                                          1 Reply Last reply
                                          0

                                          • Login

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