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

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);
    }
    
    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