考えられる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()はあなたの友達です!
幸運を!