我想知道到底发生了什么,当我把一个QWidget的update()方法。结果 这里是文件:

http://doc.qt.digia.com/4.5/qwidget html的#更新

  

此功能不会导致   立即重绘;代替的它   时间表涂料事件作为处理   当Qt的返回到主事件   环。这允许Qt来优化   更大的速度和比闪烁少   调用重绘()不

我从创建QUpdateLaterEvent并发布与按 QEvent的:: UpdateLater

Qt的源代码中看到

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

  

QEvent的:: UpdateLater:窗口小部件   应该排队以进行重新绘制   稍后的时间。

什么是“以后”是什么意思?结果 都是我的emited排队信号和油漆之前处理事件队列中的事件?

谢谢,结果 的Gabor

有帮助吗?

解决方案

检查后的QWidget ::更新()我发现的源代码它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()方法中称为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的版本之间是相同的。你不应该写代码,取决于油漆的事件相对于其他事件的顺序。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top