其他分享
首页 > 其他分享> > c-QProgressBar完成加载后无法解释的延迟

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