 <p>As documented, the item's transformations are mathematically applied in a certain order - this is the order you'd be multiplying the transform matrices in and is, conceptually, the <em>reverse</em> of the order you'd normally think of.</p> <ol> <li>The <code>transform</code> is applied. The origin point must be included in the transform itself, by applying translations during the transform.</li> <li>The <code>transformations</code> are applied - each of them can specify its own center.</li> <li><code>rotation</code> then <code>scale</code> are applied, both relative to <code>transformOriginPoint</code>.</li> </ol> <p>When you set <code>transform</code> to scaling, and set <code>rotation</code>, the rotation is performed before scaling. The scaling applies to the rotated result - it simply stretches the rotated version horizontally in your case.</p> <p>You need to somehow enforce the reverse order of operations. The only two ways to do that are:</p> <ol> <li><p>Stack the transforms in correct order and pass them to <code>transform</code>, or.</p></li> <li><p>Pass a list of correct transformations to <code>transformations</code>.</p></li> </ol> <p>I'll demonstrate how to do it either way, in an interactive fashion where you can adjust the transform parameters using sliders.</p> <p>To obtain the correct result using <code>transform</code>:</p> <pre><code>QGraphicsItem * item = ....; QTransform t; QPointF xlate = item-&gt;boundingRect().center(); t.translate(xlate.x(), xlate.y()); t.rotate(angle); t.scale(xScale, yScale); t.translate(-xlate.x(), -xlate.y()); item-&gt;setTransform(t); </code></pre> <p>To obtain the correct result using <code>transformations</code>:</p> <pre><code>QGraphicsItem * item = ....; QGraphicsRotation rot; QGraphicsScale scale; auto center = item-&gt;boundingRect().center(); rot.setOrigin(QVector3D(center)); scale.setOrigin(QVector3D(center())); item-&gt;setTransformations(QList&lt;QGraphicsTransform*&gt;() &lt;&lt; &amp;rot &lt;&lt; &amp;scale); </code></pre> <p>Finally, the example:</p> <p><img src="https://i.stack.imgur.com/wyppC.png" alt="screenshot"></p> <pre><code>#include &lt;QtWidgets&gt; struct Controller { public: QSlider angle, xScale, yScale; Controller(QGridLayout &amp; grid, int col) { angle.setRange(-180, 180); xScale.setRange(1, 10); yScale.setRange(1, 10); grid.addWidget(&amp;angle, 0, col + 0); grid.addWidget(&amp;xScale, 0, col + 1); grid.addWidget(&amp;yScale, 0, col + 2); } template &lt;typename F&gt; void connect(F f) { connect(f, f, std::move(f)); } template &lt;typename Fa, typename Fx, typename Fy&gt; void connect(Fa &amp;&amp; a, Fx &amp;&amp; x, Fy &amp;&amp; y) { QObject::connect(&amp;angle, &amp;QSlider::valueChanged, std::move(a)); QObject::connect(&amp;xScale, &amp;QSlider::valueChanged, std::move(x)); QObject::connect(&amp;yScale, &amp;QSlider::valueChanged, std::move(y)); } QTransform xform(QPointF xlate) { QTransform t; t.translate(xlate.x(), xlate.y()); t.rotate(angle.value()); t.scale(xScale.value(), yScale.value()); t.translate(-xlate.x(), -xlate.y()); return t; } }; int main(int argc, char **argv) { auto text = QStringLiteral("Hello, World!"); QApplication app(argc, argv); QGraphicsScene scene; QWidget w; QGridLayout layout(&amp;w); QGraphicsView view(&amp;scene); Controller left(layout, 0), right(layout, 4); layout.addWidget(&amp;view, 0, 3); auto ref = new QGraphicsTextItem(text); // a reference, not resized ref-&gt;setDefaultTextColor(Qt::red); ref-&gt;setTransformOriginPoint(ref-&gt;boundingRect().center()); ref-&gt;setRotation(45); scene.addItem(ref); auto leftItem = new QGraphicsTextItem(text); // controlled from the left leftItem-&gt;setDefaultTextColor(Qt::green); scene.addItem(leftItem); auto rightItem = new QGraphicsTextItem(text); // controlled from the right rightItem-&gt;setDefaultTextColor(Qt::blue); scene.addItem(rightItem); QGraphicsRotation rot; QGraphicsScale scale; rightItem-&gt;setTransformations(QList&lt;QGraphicsTransform*&gt;() &lt;&lt; &amp;rot &lt;&lt; &amp;scale); rot.setOrigin(QVector3D(rightItem-&gt;boundingRect().center())); scale.setOrigin(QVector3D(rightItem-&gt;boundingRect().center())); left.connect([leftItem, &amp;left]{ leftItem-&gt;setTransform(left.xform(leftItem-&gt;boundingRect().center()));}); right.connect([&amp;rot](int a){ rot.setAngle(a); }, [&amp;scale](int s){ scale.setXScale(s); }, [&amp;scale](int s){ scale.setYScale(s); }); right.angle.setValue(45); right.xScale.setValue(3); right.yScale.setValue(1); view.ensureVisible(scene.sceneRect()); w.show(); return app.exec(); } </code></pre>