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

时间:2009-11-13 12:00:39

标签: qt qt4 signals-slots qwidget

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

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

  

此功能不会导致   立即重画;而是它   安排一个油漆事件进行处理   当Qt回到主赛事时   环。这允许Qt优化   速度更快,闪烁更少   调用repaint()会。

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

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

  

QEvent :: UpdateLater:小部件   应排队等待重新粉刷   以后的时间。

“晚些时候”的含义是什么? 我的所有排队信号和事件队列中的事件都是在绘画之前处理的吗?

谢谢,
的Gabor

2 个答案:

答案 0 :(得分:5)

检查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仅在已经从paintEvent()方法内部调用update()时才会发布。

您还可以在第9456行检查QWidget::repaint(const QRect &rect)来源 - 它没有testAttribute(Qt::WA_WState_InPaintEvent)支票。

修改

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

所以最后回答这个问题:QUpdateLaterEvent是在发布之前在队列中的其他高优先事件和普通优先事件之后处理的。

答案 1 :(得分:4)

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