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. QProgressBar doesn't update
Qt 6.11 is out! See what's new in the release blog

QProgressBar doesn't update

Scheduled Pinned Locked Moved Solved General and Desktop
17 Posts 5 Posters 2.3k Views 3 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.
  • S Sucharek

    Ok
    Here is the full void in MainWindow.

    void MainWindow::progressBar(int percentage)
    {
        QProgressBar* progBar = new QProgressBar;
        progBar->setRange(0, 100);
        if (percentage < 0) {
            ui->gridLayout_Content->addWidget(progBar);
        } else if (percentage > 0) {
            qDebug() << percentage;
            progBar->setValue(percentage);
            progBar->update();
        } else if (percentage > 100) {
            delete progBar;
        }
    }
    

    Here is the connector:

    QObject::connect(&fT,SIGNAL(progBar(const int&)),SLOT(progressBar(const int&)), Qt::QueuedConnection);
    

    Code in thread:

    //start download
    progBar(-1);
    while(true) {
        QString percentage = getPercentage(dir + "ROM/");
        dlProg = "Downloading ROM... (" + percentage + "%)"; update(checkInternet + dlProg); //I'm also updating a label, where the percentage was shown originally
        progBar(percentage.toInt()); //here I'm emiting the percentage values
    
        avoidComplete += 1;
        if (avoidComplete > 40) {if (percentage == "100") {progBar(101); /*this is hide the bar after finished*/ break;}}
    
        msleep(100);
    }
    
    JonBJ Offline
    JonBJ Offline
    JonB
    wrote on last edited by JonB
    #6

    @Sucharek
    In that case please re-read my first answer. I gave you 4 possibilities. You answered for 3 of them sataisfactorily. The one you ignored is what is wrong in your code.

    On a separate stylistic matter:

    • Use emit as a matter of course when emitting signals.
    • Don't specify Qt::QueuedConnection explicitly, let Qt figure that for you when the signal & slot are not in the same thread.
    S 1 Reply Last reply
    1
    • S Sucharek

      Ok
      Here is the full void in MainWindow.

      void MainWindow::progressBar(int percentage)
      {
          QProgressBar* progBar = new QProgressBar;
          progBar->setRange(0, 100);
          if (percentage < 0) {
              ui->gridLayout_Content->addWidget(progBar);
          } else if (percentage > 0) {
              qDebug() << percentage;
              progBar->setValue(percentage);
              progBar->update();
          } else if (percentage > 100) {
              delete progBar;
          }
      }
      

      Here is the connector:

      QObject::connect(&fT,SIGNAL(progBar(const int&)),SLOT(progressBar(const int&)), Qt::QueuedConnection);
      

      Code in thread:

      //start download
      progBar(-1);
      while(true) {
          QString percentage = getPercentage(dir + "ROM/");
          dlProg = "Downloading ROM... (" + percentage + "%)"; update(checkInternet + dlProg); //I'm also updating a label, where the percentage was shown originally
          progBar(percentage.toInt()); //here I'm emiting the percentage values
      
          avoidComplete += 1;
          if (avoidComplete > 40) {if (percentage == "100") {progBar(101); /*this is hide the bar after finished*/ break;}}
      
          msleep(100);
      }
      
      jsulmJ Offline
      jsulmJ Offline
      jsulm
      Lifetime Qt Champion
      wrote on last edited by
      #7
      This post is deleted!
      JonBJ 1 Reply Last reply
      0
      • jsulmJ jsulm

        This post is deleted!

        JonBJ Offline
        JonBJ Offline
        JonB
        wrote on last edited by
        #8
        This post is deleted!
        1 Reply Last reply
        1
        • S Sucharek

          Ok
          Here is the full void in MainWindow.

          void MainWindow::progressBar(int percentage)
          {
              QProgressBar* progBar = new QProgressBar;
              progBar->setRange(0, 100);
              if (percentage < 0) {
                  ui->gridLayout_Content->addWidget(progBar);
              } else if (percentage > 0) {
                  qDebug() << percentage;
                  progBar->setValue(percentage);
                  progBar->update();
              } else if (percentage > 100) {
                  delete progBar;
              }
          }
          

          Here is the connector:

          QObject::connect(&fT,SIGNAL(progBar(const int&)),SLOT(progressBar(const int&)), Qt::QueuedConnection);
          

          Code in thread:

          //start download
          progBar(-1);
          while(true) {
              QString percentage = getPercentage(dir + "ROM/");
              dlProg = "Downloading ROM... (" + percentage + "%)"; update(checkInternet + dlProg); //I'm also updating a label, where the percentage was shown originally
              progBar(percentage.toInt()); //here I'm emiting the percentage values
          
              avoidComplete += 1;
              if (avoidComplete > 40) {if (percentage == "100") {progBar(101); /*this is hide the bar after finished*/ break;}}
          
              msleep(100);
          }
          
          J.HilkJ Offline
          J.HilkJ Offline
          J.Hilk
          Moderators
          wrote on last edited by
          #9

          @Sucharek besides all the other issues you have with your code,

          your QPorgressbar does neither have a QWidget parent, that is visible, nor do you call show on it

          -> you never see any of the countless QProgressbar widgets you create.


          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
          1
          • JonBJ JonB

            @Sucharek
            In that case please re-read my first answer. I gave you 4 possibilities. You answered for 3 of them sataisfactorily. The one you ignored is what is wrong in your code.

            On a separate stylistic matter:

            • Use emit as a matter of course when emitting signals.
            • Don't specify Qt::QueuedConnection explicitly, let Qt figure that for you when the signal & slot are not in the same thread.
            S Offline
            S Offline
            Sucharek
            wrote on last edited by
            #10

            @JonB, I used emit, nothing changed.
            I replace Qt::QueuedConnection to Qt::AutoConnection, but that also didn't do anything.

            JonBJ 1 Reply Last reply
            0
            • S Sucharek

              @JonB, I used emit, nothing changed.
              I replace Qt::QueuedConnection to Qt::AutoConnection, but that also didn't do anything.

              JonBJ Offline
              JonBJ Offline
              JonB
              wrote on last edited by JonB
              #11

              @Sucharek
              I said those two were stylistic.

              I already typed in what is wrong in your code. I told you there were 4 bullet points. I told you you had answered 3 of them satisfactorily. I told you that the one you ignored is what is wrong with your code. Also in @J-Hilk's post he mentions the same issue at one point. I don't feel like re-typing it when it's already there. If you still need help on it come back, but at least take the time to read which one you ignored first.....

              S 1 Reply Last reply
              1
              • SPlattenS Offline
                SPlattenS Offline
                SPlatten
                wrote on last edited by SPlatten
                #12

                @Sucharek , looking at your source, you create a new progress bar in a function:

                void MainWindow::progressBar(int percentage)
                {
                    QProgressBar* progBar = new QProgressBar;
                

                Some place elsewhere you then connect a signal and slot:

                QObject::connect(&fT,SIGNAL(progBar(const int&)),SLOT(progressBar(const int&)), Qt::QueuedConnection);
                

                What is fT, is this actually in the same place as you create the progress bar?

                What version of Qt are you using? progBar isn't a progress bar signal.

                Kind Regards,
                Sy

                S 1 Reply Last reply
                0
                • SPlattenS SPlatten

                  @Sucharek , looking at your source, you create a new progress bar in a function:

                  void MainWindow::progressBar(int percentage)
                  {
                      QProgressBar* progBar = new QProgressBar;
                  

                  Some place elsewhere you then connect a signal and slot:

                  QObject::connect(&fT,SIGNAL(progBar(const int&)),SLOT(progressBar(const int&)), Qt::QueuedConnection);
                  

                  What is fT, is this actually in the same place as you create the progress bar?

                  What version of Qt are you using? progBar isn't a progress bar signal.

                  S Offline
                  S Offline
                  Sucharek
                  wrote on last edited by
                  #13

                  Hi @SPlatten, fT is the thread name.
                  The QObject::connect calls the MainWindow::progBar slot.

                  I'm using Qt 5.15.2 (static).

                  SPlattenS 1 Reply Last reply
                  0
                  • S Sucharek

                    Hi @SPlatten, fT is the thread name.
                    The QObject::connect calls the MainWindow::progBar slot.

                    I'm using Qt 5.15.2 (static).

                    SPlattenS Offline
                    SPlattenS Offline
                    SPlatten
                    wrote on last edited by SPlatten
                    #14

                    @Sucharek , I suggest you get it working with simple code first. Also isn't your connect missing the pointer to the progress bar as the third parameter ?

                    Kind Regards,
                    Sy

                    1 Reply Last reply
                    0
                    • JonBJ JonB

                      @Sucharek
                      I said those two were stylistic.

                      I already typed in what is wrong in your code. I told you there were 4 bullet points. I told you you had answered 3 of them satisfactorily. I told you that the one you ignored is what is wrong with your code. Also in @J-Hilk's post he mentions the same issue at one point. I don't feel like re-typing it when it's already there. If you still need help on it come back, but at least take the time to read which one you ignored first.....

                      S Offline
                      S Offline
                      Sucharek
                      wrote on last edited by
                      #15

                      @JonB, ok, I think I understood the 4th solution.
                      I created a new progress bar everytime I called the progBar signal in the thread.
                      It's basically like this: create -> delete -> create -> delete -> ...
                      Here's my code:

                      delete progBar;
                      progBar = new QProgressBar; //progBar is now a global variable in MainWindow
                      progBar->setRange(0, 100);
                      if (percentage < 0) {
                          ui->gridLayout_Content->addWidget(progBar);
                      } else if (percentage > 0) {
                          qDebug() << percentage;
                          ui->gridLayout_Content->addWidget(progBar);
                          progBar->setValue(percentage);
                          progBar->update();
                      } else if (percentage > 100) {
                          delete progBar;
                      }
                      

                      I don't know if that's what you meant, but the most important thing is, that it worked. Thanks

                      JonBJ 1 Reply Last reply
                      0
                      • S Sucharek

                        @JonB, ok, I think I understood the 4th solution.
                        I created a new progress bar everytime I called the progBar signal in the thread.
                        It's basically like this: create -> delete -> create -> delete -> ...
                        Here's my code:

                        delete progBar;
                        progBar = new QProgressBar; //progBar is now a global variable in MainWindow
                        progBar->setRange(0, 100);
                        if (percentage < 0) {
                            ui->gridLayout_Content->addWidget(progBar);
                        } else if (percentage > 0) {
                            qDebug() << percentage;
                            ui->gridLayout_Content->addWidget(progBar);
                            progBar->setValue(percentage);
                            progBar->update();
                        } else if (percentage > 100) {
                            delete progBar;
                        }
                        

                        I don't know if that's what you meant, but the most important thing is, that it worked. Thanks

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

                        @Sucharek said in QProgressBar doesn't update:

                        I created a new progress bar everytime I called the progBar signal in the thread.

                        :) Well done, it's important to see things for yourself!

                        However, it still looks like you have progBar = new QProgressBar; in your slot?? The first 3 lines need to be somewhere else, either outside the slot or maybe in the if (percentage < 0) case.

                        Oh, and hang on! You have moved [copied] ui->gridLayout_Content->addWidget(progBar); into the case for every percentage update! That's not right [fortunately it won't have any effect]. That too belongs e.g. in the if (percentage < 0), or where you create the progress bar.

                        Also, be careful about you have two delete progBar;s. And you do not set the member variable to nullptr either time. This is waiting to crash on you with a "duplicate delete".....

                        S 1 Reply Last reply
                        1
                        • JonBJ JonB

                          @Sucharek said in QProgressBar doesn't update:

                          I created a new progress bar everytime I called the progBar signal in the thread.

                          :) Well done, it's important to see things for yourself!

                          However, it still looks like you have progBar = new QProgressBar; in your slot?? The first 3 lines need to be somewhere else, either outside the slot or maybe in the if (percentage < 0) case.

                          Oh, and hang on! You have moved [copied] ui->gridLayout_Content->addWidget(progBar); into the case for every percentage update! That's not right [fortunately it won't have any effect]. That too belongs e.g. in the if (percentage < 0), or where you create the progress bar.

                          Also, be careful about you have two delete progBar;s. And you do not set the member variable to nullptr either time. This is waiting to crash on you with a "duplicate delete".....

                          S Offline
                          S Offline
                          Sucharek
                          wrote on last edited by
                          #17

                          I moved these lines in to initialization void (the one with ui->setup(this)).
                          I know aboult the duplicate deletes. Thanks for reminding me.

                          1 Reply Last reply
                          1

                          • Login

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