一直搞不明白,qt的update与repaint的区别。虽然文档上说得貌似很明了了。但是,不看看源码,用着用着就迷糊了。今天看了下下相关的源码,记下自己的一点心得的。
1、update到paintEvent的调用
唉,貌似道路很曲折呀~
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()) {//这个函数在windows下总是返回true
QTLWExtra *tlwExtra = window()->d_func()->maybeTopData();
if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore)
tlwExtra->backingStore->markDirty(rect, this); // 这里只是标志了一下无效区。
} else {
d_func()->repaint_sys(rect);
}
}
如上,qt 的update函数只是通过markDirty()把无效区放到了一个叫做QWidget