QProgressBar not showing progress?

后端 未结 3 611
耶瑟儿~
耶瑟儿~ 2020-12-01 22:07

My first naive at updating my progress bar was to include the following lines in my loop which is doing the processing, making something like this:

while(dat         


        
相关标签:
3条回答
  • 2020-12-01 22:27

    You need to call QApplication::processEvents() periodically inside your processing loop to let it handle UI events.

    As Georg says, Qt is a single-threaded co-operative multitasking environment. You get full control of your process until you relinquish it voluntarily with processEvents() - until you do that, Qt can't update the UI elements, handle async HTTP requests, handle input, or pretty much anything else. It's up to you to make sure that stuff gets a timeslice while you're in a long processing loop.

    0 讨论(0)
  • 2020-12-01 22:32

    You can create a sub-class of QThread that emits a signal progressChanged, which you connect to the QProgressBar.

    connect() makes the connections auto connections per default. That means that the signal-slot-mechanism already takes care of the threading issues for you, so you don't need to worry about that.

    0 讨论(0)
  • 2020-12-01 22:34

    As @rjh and @Georg have pointed out, there are essentially two different options:

    1. Force processing of events using QApplication::processEvents(), OR
    2. Create a thread that emits signals that can be used to update the progress bar

    If you're doing any non-trivial processing, I'd recommend moving the processing to a thread.

    The most important thing to know about threads is that except for the main GUI thread (which you don't start nor create), you can never update the GUI directly from within a thread.

    The last parameter of QObject::connect() is a Qt::ConnectionType enum that by default takes into consideration whether threads are involved.

    Thus, you should be able to create a simple subclass of QThread that does the processing:

    class DataProcessingThread : public QThread
     {
    
     public:
         void run();
     signals:
         void percentageComplete(int);
     };
    
     void MyThread::run()
     {
        while(data.hasMoreItems())
        {
          doSomeProcessing(data.nextItem())
          emit percentageCompleted(computePercentageCompleted());
        }
     }
    

    And then somewhere in your GUI code:

    DataProcessingThread dataProcessor(/*data*/);
    connect(dataProcessor, SIGNAL(percentageCompleted(int)), progressBar, SLOT(setValue(int));
    dataProcessor.start();
    
    0 讨论(0)
提交回复
热议问题