Ver*_*reb 5 qt qt4 signals-slots qwidget
我想知道当我调用QWidget的update()方法时会发生什么.
这是文档:
http://doc.qt.digia.com/4.5/qwidget.html#update
此功能不会立即重新绘制; 相反,当Qt返回主事件循环时,它会调度一个paint事件进行处理.这允许Qt优化以获得比调用repaint()更快的速度和更少的闪烁.
我从Qt源代码中看到创建了一个QUpdateLaterEvent,并使用QEvent :: UpdateLater类型发布
在http://doc.qt.digia.com/4.5/qevent.html文档的这一部分中
QEvent :: UpdateLater:小部件应排队等待以后重新绘制.
"晚些时候"是什么意思?
在绘画之前,我的所有排队信号和事件队列中的事件都被处理了吗?
谢谢,
Gabor
检查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);
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,QUpdateLaterEvent仅当已经从paintEvent()方法内部调用了update()时,才会发布。
您还可以QWidget::repaint(const QRect &rect)在9456行中检查源-缺少testAttribute(Qt::WA_WState_InPaintEvent)检查。
编辑
将QUpdateLaterEvent其作为Qt::NormalEventPriority事件发布,因此将在所有其他普通优先级事件之后进行处理(请参阅src/corelib/kernel/qcoreapplication.cpp:971和:1003)。您可能还想研究compressEvent代码,但我没有检查过。
因此,最后可以回答这个问题:在发布之前,QUpdateLaterEvent在队列中的其他高优先级和普通优先级事件之后进行处理。