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