c-QProgressBar完成加载后无法解释的延迟
作者:互联网
我从一个循环(进行一些计算)发出信号,该信号触发位于主GUI上的进度条更新,在循环结束后,进度条更新为100%(进程结束时进度条被隐藏),但是有一个延迟,进度条保持在100%上,有时鼠标变为忙碌,只有几秒钟后进度条才被隐藏(指示延迟结束),在该循环之后没有任何响应,因此我无能为力想到会造成这种延迟.
>我应该注意,如果循环计算很简单(意味着不需要执行很多计算),则不会出现此类延迟.
发射信号在逻辑层的一个类内,我尝试通过包含< QtGui / QApplication>进入该类(在我看来这是不正确的事情,因为这是逻辑层,所以为什么它需要QtGui库,但我只测试了什么),我将以下代码qApp-> processEvents() ;在循环内部,现在似乎运行得更加闷闷,没有忙碌的鼠标,但是仍然存在延迟(发生此延迟时,我可以对GUI做出反应的唯一不同之处是,直到此延迟结束,才有更新的结果).
由于使用processEvents()进行了测试,我一直认为这与线程有关,但是如果是这样,我该如何纠正延迟行为,当然,如果有人认为这可能与其他事情有关,请务必告知.
一些示例代码:
逻辑层类:
#include <QtGui/QApplication>
...
processMethod(...)
{
Loop(...)
{
qApp->processEvents();
emit processBarSignle(value);
...some calculations...
}
emit processBarSignle(100);
}
视图层(MainWindow):
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的静态方法,就像仅包含QtCore库的一部分QCoreApplication就足够了.
此外,您应该在进度条更新之后而不是在此之前添加processEvents().
注意,在处理完Qt的事件队列中的每个事件之前,processEvents()不会返回.如果有一个“取消”按钮,您每次调用processEvents()时都必须检查用户是否实际上取消了该操作.
您可以使用排除用户特定的事件,例如鼠标单击/按键
QCoreApplication::processEvents( QEventLoop::ExcludeUserInputEvents )
但这不允许在循环处于活动状态时单击任何内容(例如“取消”按钮).
进一步说明:应该称为“ processBarSi ng le” ;-)
澄清线程等:
您的整个循环以及任何鼠标单击等都仅在一个线程中执行.如果调用emit(),则立即执行连接到该信号的插槽(除非该插槽实际上位于其他线程中).同时,循环不会继续!
插槽完成后,循环将继续.在我的示例中,这意味着将调用processEvents().现在,如果您的插槽更新了进度条或执行了其他导致重绘的操作,则事件队列中将出现一个重绘事件,并且此重绘将立即发生.
如果您在调用插槽之前执行processEvents(),则此时将无法处理任何重绘事件.
再一次,直到processEvents()完成才开始循环.处理完所有未决事件后,循环将继续您的计算.
标签:c,qt,qprogressbar 来源: https://codeday.me/bug/20191013/1907960.html