gpt4 book ai didi

c++ - QProgressBar 卡在 98%

转载 作者:行者123 更新时间:2023-11-28 03:38:24 25 4
gpt4 key购买 nike

我是 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 属性“maximum”不正好是 100,它将不会达到 100%。您的“val”也忽略了“progressBar”最大值,因此需要修复:

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

大部分工作都有明确的进度概念,这里不明显。您的 while 循环可能太快而无法直观地识别进度步骤。考虑用信号/槽对替换 while 循环以同步 progressBar。这也将允许 Qt 有时进入事件循环以更新您的应用程序。如果你调用的进程向 stdout 输出一些合理的东西,考虑使用信号 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() 是你的 friend !

祝你好运!

关于c++ - QProgressBar 卡在 98%,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10166939/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com