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

考えられる2つのポイント:QProcess ::: state()はQtイベントループに入らないため、繰り返し呼び出すとアプリケーションは更新されません。すべてのQtロジックがハングします。そして、progressBarの初期化を確認します。progressBarプロパティの「maximum」が正確に100でない場合、100%には達しません。「val」も「progressBar」の最大値を無視するため、修正が必要です。

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

ほとんどの仕事には進歩の明確な概念がありますが、ここでは明らかではありません。whileループが速すぎて、進行状況のステップを視覚的に認識できない可能性があります。プログレスバーを同期するには、whileループを信号/スロットのペアに置き換えることを検討してください。これにより、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倍「true」であることを確認してください。ループを100回繰り返すことができます。qDebug()はあなたの友達です!

幸運を!

于 2012-04-16T06:37:01.237 に答える