diff options
author | Bjørn Erik Nilsen <bjorn.nilsen@nokia.com> | 2010-02-24 10:11:21 (GMT) |
---|---|---|
committer | Bjørn Erik Nilsen <bjorn.nilsen@nokia.com> | 2010-02-24 13:22:56 (GMT) |
commit | bc3e50ec44fd9ae9a665826a40f325a61087568b (patch) | |
tree | d7000555477f8c54164faa1dadbec3a9e892fc54 /src/gui | |
parent | 9be49ff72e7f34bd22b0375dccf142bd79f94fb6 (diff) | |
download | Qt-bc3e50ec44fd9ae9a665826a40f325a61087568b.zip Qt-bc3e50ec44fd9ae9a665826a40f325a61087568b.tar.gz Qt-bc3e50ec44fd9ae9a665826a40f325a61087568b.tar.bz2 |
GV: Update issues if drawItems() is overridden and IndirectPainting is used.
Problem was that the cached view bounding rect was never updated when
overriding QGraphicsScene::drawItems or QGraphicsView::drawItems, without
calling the base class implementation. The same for 'updateAll' boolean.
We also have to make sure there are no unpolished items before we draw.
Regression against 4.5.
Auto-test included.
Task-number: QTBUG-7880
Reviewed-by: yoann
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/graphicsview/qgraphicsview.cpp | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/src/gui/graphicsview/qgraphicsview.cpp b/src/gui/graphicsview/qgraphicsview.cpp index 06b7438..1ced3d7 100644 --- a/src/gui/graphicsview/qgraphicsview.cpp +++ b/src/gui/graphicsview/qgraphicsview.cpp @@ -3400,6 +3400,13 @@ void QGraphicsView::paintEvent(QPaintEvent *event) if (!d->scene->d_func()->painterStateProtection) painter.setWorldTransform(viewTransform); } else { + // Make sure we don't have unpolished items before we draw + if (!d->scene->d_func()->unpolishedItems.isEmpty()) + d->scene->d_func()->_q_polishItems(); + // We reset updateAll here (after we've issued polish events) + // so that we can discard update requests coming from polishEvent(). + d->scene->d_func()->updateAll = false; + // Find all exposed items bool allItems = false; QList<QGraphicsItem *> itemList = d->findItems(d->exposedRegion, &allItems, viewTransform); @@ -3408,9 +3415,25 @@ void QGraphicsView::paintEvent(QPaintEvent *event) const int numItems = itemList.size(); QGraphicsItem **itemArray = &itemList[0]; // Relies on QList internals, but is perfectly valid. QStyleOptionGraphicsItem *styleOptionArray = d->allocStyleOptionsArray(numItems); + QTransform transform(Qt::Uninitialized); for (int i = 0; i < numItems; ++i) { - itemArray[i]->d_ptr->initStyleOption(&styleOptionArray[i], viewTransform, - d->exposedRegion, allItems); + QGraphicsItem *item = itemArray[i]; + QGraphicsItemPrivate *itemd = item->d_ptr.data(); + itemd->initStyleOption(&styleOptionArray[i], viewTransform, d->exposedRegion, allItems); + // Cache the item's area in view coordinates. + // Note that we have to do this here in case the base class implementation + // (QGraphicsScene::drawItems) is not called. If it is, we'll do this + // operation twice, but that's the price one has to pay for using indirect + // painting :-/. + const QRectF brect = adjustedItemEffectiveBoundingRect(item); + if (!itemd->itemIsUntransformable()) { + transform = item->sceneTransform(); + if (viewTransformed) + transform *= viewTransform; + } else { + transform = item->deviceTransform(viewTransform); + } + itemd->paintedViewBoundingRects.insert(d->viewport, transform.mapRect(brect).toRect()); } // Draw the items. drawItems(&painter, numItems, itemArray, styleOptionArray); |