summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gui/graphicsview/qgraphicsitem.cpp15
-rw-r--r--tests/auto/qgraphicseffect/tst_qgraphicseffect.cpp34
2 files changed, 4 insertions, 45 deletions
diff --git a/src/gui/graphicsview/qgraphicsitem.cpp b/src/gui/graphicsview/qgraphicsitem.cpp
index ff21296..73e8eed 100644
--- a/src/gui/graphicsview/qgraphicsitem.cpp
+++ b/src/gui/graphicsview/qgraphicsitem.cpp
@@ -2845,23 +2845,16 @@ QRectF QGraphicsItemPrivate::effectiveBoundingRect(const QRectF &rect) const
If the item has an effect, the effective rect can be larger than the item's
bouding rect, depending on the effect.
- \a topMostEffectItem is the top most parent of which a possible QGraphicsEffect
- should be taken into account (\a topMostEffectItem is inclusive). Any effects
- of any ancestors of \a topMostEffectItem are not taken into consideration.
-
\sa boundingRect()
*/
QRectF QGraphicsItemPrivate::effectiveBoundingRect(QGraphicsItem *topMostEffectItem) const
{
#ifndef QT_NO_GRAPHICSEFFECT
Q_Q(const QGraphicsItem);
- // Take into account the items own effect
QRectF brect = effectiveBoundingRect(q_ptr->boundingRect());
-
- if (topMostEffectItem == q)
+ if (ancestorFlags & QGraphicsItemPrivate::AncestorClipsChildren || topMostEffectItem == q)
return brect;
- // Take into account any effects applied to the parents
const QGraphicsItem *effectParent = parent;
while (effectParent) {
QGraphicsEffect *effect = effectParent->d_ptr->graphicsEffect;
@@ -2870,10 +2863,10 @@ QRectF QGraphicsItemPrivate::effectiveBoundingRect(QGraphicsItem *topMostEffectI
const QRectF effectRectInParentSpace = effectParent->d_ptr->effectiveBoundingRect(brectInParentSpace);
brect = effectParent->mapRectToItem(q, effectRectInParentSpace);
}
- if (effectParent && (effectParent->d_ptr->flags & QGraphicsItem::ItemClipsChildrenToShape))
- return brect.intersected(q->mapRectFromItem(effectParent, effectParent->boundingRect()));
- else if (topMostEffectItem == effectParent)
+ if (effectParent->d_ptr->ancestorFlags & QGraphicsItemPrivate::AncestorClipsChildren
+ || topMostEffectItem == effectParent) {
return brect;
+ }
effectParent = effectParent->d_ptr->parent;
}
diff --git a/tests/auto/qgraphicseffect/tst_qgraphicseffect.cpp b/tests/auto/qgraphicseffect/tst_qgraphicseffect.cpp
index 3d45a07..9c189cb 100644
--- a/tests/auto/qgraphicseffect/tst_qgraphicseffect.cpp
+++ b/tests/auto/qgraphicseffect/tst_qgraphicseffect.cpp
@@ -68,7 +68,6 @@ private slots:
void boundingRectFor();
void boundingRect();
void boundingRect2();
- void boundingRect3();
void draw();
void opacity();
void grayscale();
@@ -320,39 +319,6 @@ void tst_QGraphicsEffect::boundingRect2()
QCOMPARE(effect->boundingRect(), effect->boundingRectFor(childRect | grandChildRect));
}
-void tst_QGraphicsEffect::boundingRect3()
-{
- QGraphicsScene scene;
- QGraphicsRectItem *root = new QGraphicsRectItem;
- scene.addItem(root);
- QRectF rootRect(0, 0, 100, 100);
- root->setFlag(QGraphicsItem::ItemClipsChildrenToShape);
- root->setRect(rootRect);
-
- QGraphicsRectItem *child = new QGraphicsRectItem;
- child->setPos(5,5);
- child->setParentItem(root);
- CustomEffect *effect1 = new CustomEffect;
- child->setGraphicsEffect(effect1);
-
- QGraphicsRectItem *grandChild = new QGraphicsRectItem;
- QRectF grandChildRect(0, 0, 50, 50);
- grandChild->setRect(grandChildRect);
- grandChild->setPos(10,10);
- grandChild->setParentItem(child);
- CustomEffect *effect2 = new CustomEffect;
- grandChild->setGraphicsEffect(effect2);
-
- QRectF effectiveBoundingRectGrandChild = effect2->boundingRectFor(grandChildRect);
- QCOMPARE(effect2->boundingRect(), effectiveBoundingRectGrandChild);
-
- QRectF effectiveBoundingRectChildAndGrandChild = effect1->boundingRectFor(child->mapRectFromItem(grandChild, effectiveBoundingRectGrandChild));
- QCOMPARE(effect1->boundingRect(),effectiveBoundingRectChildAndGrandChild);
-
- // The children bounding rect of the root should be the rectangle of the grandChild enlarged twice by the CustomEffect on the grandChild and the child, but clipped by the root item
- QCOMPARE(root->childrenBoundingRect(), root->boundingRect().intersected(root->mapRectFromItem(child, effectiveBoundingRectChildAndGrandChild)));
-}
-
void tst_QGraphicsEffect::draw()
{
QGraphicsScene scene;