6

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

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

此函数不会导致立即重绘;相反,它会在 Qt 返回主事件循环时安排一个绘制事件进行处理。与调用 repaint() 相比,这允许 Qt 进行优化以获得更快的速度和更少的闪烁。

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

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

QEvent::UpdateLater:小部件应该排队等待稍后重新绘制。

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

谢谢,
加博尔

4

2 回答 2

6

检查 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 是在发布之前在队列中的其他高优先级和正常优先级事件之后处理的。

于 2009-11-13T12:50:20.440 回答
4

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

于 2009-11-13T21:49:07.087 回答