首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >主线程阻塞了QProgressBar?

主线程阻塞了QProgressBar?
EN

Stack Overflow用户
提问于 2017-09-11 20:59:43
回答 3查看 568关注 0票数 0

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

代码语言:javascript
复制
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被阻塞并关闭。

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

EN

回答 3

Stack Overflow用户

发布于 2017-09-11 21:44:11

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

代码语言:javascript
复制
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);
} 
票数 3
EN

Stack Overflow用户

发布于 2017-09-11 21:54:59

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

票数 1
EN

Stack Overflow用户

发布于 2017-09-12 03:34:14

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

修复if的一种方法是将处理事件循环事件的循环QApplication::processEvents();添加到循环中。当然,你也应该调用bar->setValue(i);

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46156374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档