QProgressBar没有显示进度?

Gra*_*oob 10 user-interface qt multithreading

我在更新进度条时的第一个天真就是在我的循环中包含以下几行,正在进行处理,制作如下:

while(data.hasMoreItems())
{
    doSomeProcessing(data.nextItem())

    //Added these lines but they don't do anything
    ui->progressBar->setValue(numberProcessed++);
    ui->progressBar->repaint();
}
Run Code Online (Sandbox Code Playgroud)

我认为repaint()在更新GUI时添加会使执行暂停,但显然它并不那么简单.看完问题后:

QProgressBar错误
进度条未显示进度

看起来我将不得不将数据处理放在不同的线程中,然后将来自数据处理线程的信号连接到GUI线程以更新进度条.我对GUI和线程缺乏经验,我想知道是否有人能指出我正确的方向,即我应该使用什么Qt类来实现.我猜我需要一个QThread对象,但我一直在查看QProgressBar文档,但它没有提出线程主题.

Kal*_*son 13

正如@rjh和@Georg指出的那样,基本上有两种不同的选择:

  1. 使用QApplication :: processEvents(),OR 强制处理事件
  2. 创建一个发出可用于更新进度条的信号的线程

如果您正在进行任何非平凡的处理,我建议将处理移至线程.

关于线程最重要的事情是除了主GUI线程(你没有启动或创建)之外,你永远不能直接从线程内更新GUI.

QObject :: connect()的最后一个参数是Qt :: ConnectionType枚举,默认情况下会考虑是否涉及线程.

因此,您应该能够创建一个QThread执行处理的简单子类:

class DataProcessingThread : public QThread
 {

 public:
     void run();
 signals:
     void percentageComplete(int);
 };

 void MyThread::run()
 {
    while(data.hasMoreItems())
    {
      doSomeProcessing(data.nextItem())
      emit percentageCompleted(computePercentageCompleted());
    }
 }
Run Code Online (Sandbox Code Playgroud)

然后在GUI代码中的某处:

DataProcessingThread dataProcessor(/*data*/);
connect(dataProcessor, SIGNAL(percentageCompleted(int)), progressBar, SLOT(setValue(int));
dataProcessor.start();
Run Code Online (Sandbox Code Playgroud)