gpt4 book ai didi

Qt 小部件稍后更新,但什么时候更新?

转载 作者:行者123 更新时间:2023-12-04 17:42:00 26 4
gpt4 key购买 nike

我想知道当我调用 QWidget 的 update() 方法时到底发生了什么。
这是文档:

http://doc.qt.digia.com/4.5/qwidget.html#update

This function does not cause an immediate repaint; instead it schedules a paint event for processing when Qt returns to the main event loop. This permits Qt to optimize for more speed and less flicker than a call to repaint() does.



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

在文档的这一部分
http://doc.qt.digia.com/4.5/qevent.html

QEvent::UpdateLater: The widget should be queued to be repainted at a later time.



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

谢谢,
加博

最佳答案

检查 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() 时,才会发布 QUpdateLaterEvent

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

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

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

关于Qt 小部件稍后更新,但什么时候更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1728805/

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