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.4k 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);
    }
    
    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