QProgressBar被主线程阻止?

时间:2017-09-11 12:59:43

标签: multithreading qt blocked qprogressbar

=============================================== ======

QProgressBar* pbar = new QProgressBar(this);
pbar->setMinimum(0);
pbar->setMaximum(0);
pbar->show();
for (int i = 0; i < 10000; i++) {
    qDebug() << "=====flag1======";
}
pbar->close();

=============================================== ============

我想让ProgressBar在qDebug()消息时显示忙,但是没有效果,QProgressBar被阻塞并在循环结束时关闭。

有谁知道如何解决这个问题?谢谢!

3 个答案:

答案 0 :(得分:2)

是GUI被阻止,因为10 000这是很多时间。 使用QThread http://doc.qt.io/qt-4.8/qthread.html

void My_Thread::run() {
    for (int i = 0; i < 1e4; i++) {
        if (i % 100 == 0) {
            emit UpdateProgressBar(i);
        }
    }
}



//In Your SLOT
void MainWindow::UpdateProgressbar(int value) {
    ui->progressbar->setValue(value);
} 

答案 1 :(得分:1)

在UI出现之前,主循环被循环锁定,并且在循环结束后立即更新UI。 如果要查看进度条,可以添加QApplication :: processEvents();在循环内。这不是最好的解决方案,但它会起作用。

答案 2 :(得分:1)

要使任何窗口小部件显示,必须处理事件循环。 由于您可以完全控制主线程,因此它的事件循环无法处理将显示和更新QProgressBar的事件。

修复if的方法是快速但是crapy会添加到循环QApplication::processEvents();,它会处理事件循环的平均值。 Ofcaource你也应该致电bar->setValue(i);

正确的方法是使用信号和插槽进行异步编程。您没有提供有关实际问题的任何详细信息,因此无法提供良好的解决方案。