题
我想知道到底发生了什么,当我把一个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的版本之间是相同的。你不应该写代码,取决于油漆的事件相对于其他事件的顺序。