检查 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);
}
}
如您所见,QUpdateLaterEvent
仅当 update() 已从 paintEvent() 方法内部调用时才发布。
您还可以QWidget::repaint(const QRect &rect)
在第 9456 行检查源代码 - 它缺少testAttribute(Qt::WA_WState_InPaintEvent)
检查。
编辑
QUpdateLaterEvent
是作为事件发布的,Qt::NormalEventPriority
因此它会在所有其他正常优先级事件之后进行处理(请参阅src/corelib/kernel/qcoreapplication.cpp:971
和:1003
)。您可能还想查看 compressEvent 代码,我没有检查过。
所以最后回答这个问题:QUpdateLaterEvent 是在发布之前在队列中的其他高优先级和正常优先级事件之后处理的。