0

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

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 被阻塞并在循环完成时关闭。

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

4

3 回答 3

3

是的,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);
} 
于 2017-09-11T13:44:10.830 回答
1

为了让任何小部件出现事件循环,必须进行处理。由于您可以完全控制主线程,因此它的事件循环无法处理将显示和更新的事件QProgressBar

解决 if 的一种方法是快速但很糟糕,它是添加到QApplication::processEvents();处理事件循环的事件循环的循环中。Ofcaource 你也应该打电话给bar->setValue(i);.

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

于 2017-09-11T19:34:14.200 回答
1

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

于 2017-09-11T13:54:58.807 回答