QProgressBar悬挂在98%

时间:2012-04-15 20:25:08

标签: c++ qt

我是Qt的初学者,我正在尝试为我的应用程序的gui显示进程条。我写了以下代码

void my_app::progress()
{
  int val=1;
  while(process.state()!=0)
  {
    ui->progressBar->setValue(val++);
  }
  ui->progressBar->setValue(100);
}

但进度条悬挂在98%。任何人都可以建议我解决一些问题 谢谢!

1 个答案:

答案 0 :(得分:2)

两个可能的点:QProcess ::: state()不会进入Qt事件循环 - 因此反复调用它不会更新您的应用程序;你所有的Qt逻辑都挂起了。并验证progressBar初始化:如果progressBar属性"最大"不完全是100,它不会达到100%。你的" val"也忽略了" progressBar"最大值,因此需要修复:

 if( val < ui->progressBar->maximum() )
   ui->progressBar->setValue(val++);     

大多数工作都有明确的进步概念,这在这里并不明显。您的while循环可能太快,无法在视觉上识别进度步骤。考虑用信号/插槽对替换while循环来同步progressBar。这也将允许Qt有时进入事件循环以更新您的应用程序。如果被调用的进程向stdout输出合理的内容,请考虑使用信号QProcess :: readyReadStandardOutput()。也许你的过程会做一些事情,即填充一个缓冲区,你可以用它来表示进度 - 或者只是输出一个计数到stdout。让我在这里草绘:

.. Somewhere in your my_app constructor ...
.. ui->progressBar->setRange(0, 100); ..
.. connect( this, SIGNAL(processProgressSignal(int)), this, SLOT(progressSlot(int) ); ..
.. connect( &process, SIGNAL(readyReadStandardError()), this, SLOT(processProgress()) ); ..

Q_SIGNALS:
void processProgressSignal( int val );


Q_SLOTS:
void my_app::processProgress()
{
     int val = 1;

     // Insert your process progress calculation here
     // Example: Parse the result of QByteArray QProcess::readAllStandardOutput()
     // Example: val = ( buffer.currLength / buffer.maxLength ) * 100;

     Q_EMIT processProgressSignal( val );
}

void my_app::progressSlot(int val)
{
     if( val < ui->progressBar->maximum() )
       ui->progressBar->setValue(val++);     
}

如果这没有帮助,请确保process.state()是100次&#34; true&#34; - 允许循环100次迭代。 qDebug()是你的朋友!

祝你好运!