0

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

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

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

4

1 回答 1

2

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

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

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

.. 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 次 - 以允许循环进行 100 次迭代。qDebug() 是你的朋友!

祝你好运!

于 2012-04-16T06:37:01.237 回答