Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt小部件稍后更新,但何时更新?_Qt_Qt4_Signals Slots_Qwidget - Fatal编程技术网

Qt小部件稍后更新,但何时更新?

Qt小部件稍后更新,但何时更新?,qt,qt4,signals-slots,qwidget,Qt,Qt4,Signals Slots,Qwidget,我想知道调用QWidget的update()方法时会发生什么情况。 以下是文件: 此函数不会导致错误 立即重新油漆;而不是它 安排绘制事件进行处理 当Qt返回到主事件时 环这允许Qt针对以下情况进行优化: 速度更快,闪烁更少 调用repaint()则不起作用 我从Qt源代码中看到,创建了一个QUpdateLaterEvent,并使用QEvent::UpdateLater类型发布 在本部分的文档中 QEvent::UpdateLater:小部件 应排队在指定的时间重新绘制 晚些时候 “晚一点”

我想知道调用QWidget的update()方法时会发生什么情况。
以下是文件:

此函数不会导致错误 立即重新油漆;而不是它 安排绘制事件进行处理 当Qt返回到主事件时 环这允许Qt针对以下情况进行优化: 速度更快,闪烁更少 调用repaint()则不起作用

我从Qt源代码中看到,创建了一个QUpdateLaterEvent,并使用QEvent::UpdateLater类型发布

在本部分的文档中

QEvent::UpdateLater:小部件 应排队在指定的时间重新绘制 晚些时候

“晚一点”是什么意思?
我的所有发射的排队信号和事件队列中的事件是否在绘制之前处理

谢谢,

Gabor

在检查QWidget::update()源代码后,我发现它在
src/gui/kernel/QWidget.cpp:9544中调用了这个方法:

void QWidget::update(const QRect &rect)
{
    if (!isVisible() || !updatesEnabled() || rect.isEmpty())
        return;

    if (testAttribute(Qt::WA_WState_InPaintEvent)) {
        QApplication::postEvent(this, new QUpdateLaterEvent(rect));
        return;
    }

    if (hasBackingStoreSupport()) {
        QTLWExtra *tlwExtra = window()->d_func()->maybeTopData();
        if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore)
            tlwExtra->backingStore->markDirty(rect, this);
    } else {
        d_func()->repaint_sys(rect);
    }
}
正如您所看到的,只有在已经从paintEvent()方法内部调用update()时,才会发布
qupdateratevent

您还可以在第9456行检查
QWidget::repaint(const QRect&rect)
source-它缺少
testAttribute(Qt::WA_WState_InPaintEvent)
check

编辑

qpdateratevent
作为
Qt::NormalEventPriority
事件发布,因此它在所有其他正常优先级事件之后得到处理(请参见
src/corelib/kernel/qcoreapplication.cpp:971
:1003
)。您可能还想查看compressEvent代码,我还没有检查过


因此,最后要回答这个问题:QUpdateLaterEvent是在发布之前队列中的其他高优先级和正常优先级事件之后处理的。

没有记录行为==不保证在Qt版本之间保持不变。您不应该编写依赖于绘制事件相对于其他事件的顺序的代码。

您可以使用“QWidget::repaint()”方法来确保您的小部件将被重新绘制。或者这不是你的选择?不,这不是一个选择。我在另一个线程中发出排队信号,导致小部件更新。我在一个之后发出多个这样的信号,我想确保排队的信号在更新之前得到处理,并且不会更新多次。谢谢,但是我以前见过这个函数。但我想知道发布的事件会发生什么。活动的优先顺序是什么?在此事件之前/之后处理哪些其他事件。在另一个线程中向主线程发出的排队信号如何?信号是在事件发生之前处理的吗?文档对此有点含糊不清:无法完全弄清楚信号是在发送方还是接收方的事件循环上排队。绘画在主线程上,我从另一个线程向主线程发出非阻塞排队信号。所以我猜它是在接收者的线程上排队的。