gpt4 book ai didi

c++ - QProgressBar 完成加载后无法解释的延迟

转载 作者:太空宇宙 更新时间:2023-11-04 14:10:55 24 4
gpt4 key购买 nike

我从一个循环(进行一些计算)发出信号,触发位于主 GUI 上的进度条更新,循环结束后进度条更新为 100%(进程结束时进度条隐藏) ,但是有延迟,进度条保持在 100%,有时鼠标变为忙碌,只有几秒钟后进度条才隐藏(表明延迟结束),循环之后没有任何东西,所以我能想到的任何事情都不能造成这种延迟。

  • 我应该注意,如果循环计算很轻(意味着不需要进行大量计算),则不会出现这种延迟。

发射信号在逻辑层的一个类中,我已经通过包含 <QtGui/QApplication> 来尝试一些东西进入那个类(在我看来这不是正确的做法,因为这是逻辑层所以它为什么需要 QtGui 库,但我只是在测试一些东西),我把下面的代码 qApp->processEvents();在循环中,现在事情似乎变得令人窒息,没有忙碌的鼠标,但仍然存在延迟(唯一不同的是,当发生这种延迟时,我可以对 GUI 使用react,但在这种延迟结束之前没有更新的结果)。

因为测试了 processEvents()我以为它与线程有关,但如果是这样,我该如何纠正延迟行为,当然,如果有人认为它可能是其他原因,请告诉我。

一些示例代码:

逻辑层类:

#include <QtGui/QApplication>
...

processMethod(...)
{
Loop(...)
{
qApp->processEvents();
emit processBarSignle(value);
...some calculations...
}
emit processBarSignle(100);
}

View 层(主窗口):

on_btn_nextProcess_clicked()
{
m_ui->pBar_process->setVisible(true);
LogicClass->processMethod(...);
m_ui->pBar_process->setVisible(false);
}

谢谢

最佳答案

尝试以下操作:

#include <QtCore/QCoreApplication>
...

processMethod(...)
{
Loop(...)
{
emit processBarSignle(value);
QCoreApplication::processEvents();
...some calculations...
}
emit processBarSignle(100);
QCoreApplication::processEvents();
}

processEvents()QCoreApplication 的静态方法, 这样只包含 QCoreApplication 就足够了,它是 QtCore 库的一部分。

此外,您应该在进度条更新之后添加 processEvents(),而不是在此之前。

注意 processEvents() 直到 Qt 事件队列中的每个事件都被处理后才会返回。如果有例如Cancel 按钮,您必须在每次调用 processEvents() 时检查用户是否真的取消了操作。
您可以使用

排除特定于用户的事件,例如鼠标点击/按键
QCoreApplication::processEvents( QEventLoop::ExcludeUserInputEvents )

但这将不允许在循环处于事件状态时单击任何内容(例如取消按钮)。

作为进一步说明:它应该被称为“processBarSi ng le”;-)


关于线程等的说明:

你的整个循环,以及任何鼠标点击等都只在一个线程中执行。如果您调用 emit(),则连接到该 signalslot 会立即执行(除非该 slot 实际上位于不同的线程)。与此同时,循环不会继续!

当插槽结束时,您的循环将继续。在我的示例中,这意味着 processEvents() 将被调用。现在,如果您的插槽更新了进度条或执行了导致重绘的任何其他操作,事件队列中将有一个重绘事件,并且现在将进行重绘。
如果您在调用插槽之前执行 processEvents(),此时将不会有可以处理的重绘事件。

再一次,循环不会继续,直到 processEvents() 完全完成。处理完所有未决事件后,循环将继续您的计算。

关于c++ - QProgressBar 完成加载后无法解释的延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14398050/

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