我是Qt的初学者,我正在尝试为我的应用程序的gui显示进程条。我写了以下代码
void my_app::progress()
{
int val=1;
while(process.state()!=0)
{
ui->progressBar->setValue(val++);
}
ui->progressBar->setValue(100);
}
但进度条悬挂在98%。任何人都可以建议我解决一些问题 谢谢!
答案 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()是你的朋友!
祝你好运!