summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/widgets/graphicsview/qgraphicsitem.cpp11
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp61
2 files changed, 69 insertions, 3 deletions
diff --git a/src/widgets/graphicsview/qgraphicsitem.cpp b/src/widgets/graphicsview/qgraphicsitem.cpp
index 1c15905ff0..db2b71f508 100644
--- a/src/widgets/graphicsview/qgraphicsitem.cpp
+++ b/src/widgets/graphicsview/qgraphicsitem.cpp
@@ -4199,9 +4199,14 @@ QTransform QGraphicsItem::deviceTransform(const QTransform &viewportTransform) c
return QTransform();
}
- // First translate the base untransformable item.
- untransformedAncestor->d_ptr->ensureSceneTransform();
- QPointF mappedPoint = (untransformedAncestor->d_ptr->sceneTransform * viewportTransform).map(QPointF(0, 0));
+ // Determine the inherited origin. Find the parent of the topmost untransformable.
+ // Use its scene transform to map the position of the untransformable. Then use
+ // that viewport position as the anchoring point for the untransformable subtree.
+ QGraphicsItem *parentOfUntransformedAncestor = untransformedAncestor->parentItem();
+ QTransform inheritedMatrix;
+ if (parentOfUntransformedAncestor)
+ inheritedMatrix = parentOfUntransformedAncestor->sceneTransform();
+ QPointF mappedPoint = (inheritedMatrix * viewportTransform).map(untransformedAncestor->pos());
// COMBINE
QTransform matrix = QTransform::fromTranslate(mappedPoint.x(), mappedPoint.y());
diff --git a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp
index 3e24257736..9353aa0eba 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp
@@ -471,6 +471,7 @@ private slots:
void QTBUG_16374_crashInDestructor();
void QTBUG_20699_focusScopeCrash();
void QTBUG_30990_rightClickSelection();
+ void QTBUG_21618_untransformable_sceneTransform();
private:
QList<QGraphicsItem *> paintedItems;
@@ -11496,5 +11497,65 @@ void tst_QGraphicsItem::QTBUG_30990_rightClickSelection()
QVERIFY(!item2->isSelected());
}
+void tst_QGraphicsItem::QTBUG_21618_untransformable_sceneTransform()
+{
+ QGraphicsScene scene(0, 0, 150, 150);
+ scene.addRect(-2, -2, 4, 4);
+
+ QGraphicsItem *item1 = scene.addRect(0, 0, 100, 100, QPen(), Qt::red);
+ item1->setPos(50, 50);
+ item1->translate(50, 50);
+ item1->rotate(90);
+ QGraphicsItem *item2 = scene.addRect(0, 0, 100, 100, QPen(), Qt::green);
+ item2->setPos(50, 50);
+ item2->translate(50, 50);
+ item2->rotate(90);
+ item2->setFlags(QGraphicsItem::ItemIgnoresTransformations);
+
+ QGraphicsRectItem *item1_topleft = new QGraphicsRectItem(QRectF(-2, -2, 4, 4));
+ item1_topleft->setParentItem(item1);
+ item1_topleft->setBrush(Qt::black);
+ QGraphicsRectItem *item1_bottomright = new QGraphicsRectItem(QRectF(-2, -2, 4, 4));
+ item1_bottomright->setParentItem(item1);
+ item1_bottomright->setPos(100, 100);
+ item1_bottomright->setBrush(Qt::yellow);
+
+ QGraphicsRectItem *item2_topleft = new QGraphicsRectItem(QRectF(-2, -2, 4, 4));
+ item2_topleft->setParentItem(item2);
+ item2_topleft->setBrush(Qt::black);
+ QGraphicsRectItem *item2_bottomright = new QGraphicsRectItem(QRectF(-2, -2, 4, 4));
+ item2_bottomright->setParentItem(item2);
+ item2_bottomright->setPos(100, 100);
+ item2_bottomright->setBrush(Qt::yellow);
+
+ QCOMPARE(item1->sceneTransform(), item2->sceneTransform());
+ QCOMPARE(item1_topleft->sceneTransform(), item2_topleft->sceneTransform());
+ QCOMPARE(item1_bottomright->sceneTransform(), item2_bottomright->sceneTransform());
+ QCOMPARE(item1->deviceTransform(QTransform()), item2->deviceTransform(QTransform()));
+ QCOMPARE(item1->deviceTransform(QTransform()).map(QPointF()), QPointF(100, 100));
+ QCOMPARE(item2->deviceTransform(QTransform()).map(QPointF()), QPointF(100, 100));
+ QCOMPARE(item1->deviceTransform(QTransform()).map(QPointF(100, 100)), QPointF(0, 200));
+ QCOMPARE(item2->deviceTransform(QTransform()).map(QPointF(100, 100)), QPointF(0, 200));
+ QCOMPARE(item1_topleft->deviceTransform(QTransform()).map(QPointF()), QPointF(100, 100));
+ QCOMPARE(item2_topleft->deviceTransform(QTransform()).map(QPointF()), QPointF(100, 100));
+ QCOMPARE(item1_bottomright->deviceTransform(QTransform()).map(QPointF()), QPointF(0, 200));
+ QCOMPARE(item2_bottomright->deviceTransform(QTransform()).map(QPointF()), QPointF(0, 200));
+
+ item2->setParentItem(item1);
+
+ QCOMPARE(item2->deviceTransform(QTransform()).map(QPointF()), QPointF(100, 200));
+ QCOMPARE(item2->deviceTransform(QTransform()).map(QPointF(100, 100)), QPointF(0, 300));
+ QCOMPARE(item2_topleft->deviceTransform(QTransform()).map(QPointF()), QPointF(100, 200));
+ QCOMPARE(item2_bottomright->deviceTransform(QTransform()).map(QPointF()), QPointF(0, 300));
+
+ QTransform tx = QTransform::fromTranslate(100, 0);
+ QCOMPARE(item1->deviceTransform(tx).map(QPointF()), QPointF(200, 100));
+ QCOMPARE(item1->deviceTransform(tx).map(QPointF(100, 100)), QPointF(100, 200));
+ QCOMPARE(item2->deviceTransform(tx).map(QPointF()), QPointF(200, 200));
+ QCOMPARE(item2->deviceTransform(tx).map(QPointF(100, 100)), QPointF(100, 300));
+ QCOMPARE(item2_topleft->deviceTransform(tx).map(QPointF()), QPointF(200, 200));
+ QCOMPARE(item2_bottomright->deviceTransform(tx).map(QPointF()), QPointF(100, 300));
+}
+
QTEST_MAIN(tst_QGraphicsItem)
#include "tst_qgraphicsitem.moc"