私も同じ問題に直面し、それを理解するのに少し時間がかかりました。これが私がそれを解決した方法です。
QGraphicsItemクラスを拡張し、paint()をオーバーライドします。paint()内で、変換のスケーリング係数を1(m11とm22)にリセットし、リセットする前にm11(xスケーリング係数)とm22(yスケーリング係数)を保存します。次に、通常どおりに描画しますが、xにm11を掛け、yにm22を掛けます。これにより、デフォルトの変換での描画が回避されますが、シーンの変換に従って位置が明示的に計算されます。
void MyItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *item, QWidget *widget)
{
QTransform t = painter->transform();
qreal m11 = t.m11(), m22 = t.m22();
painter->save(); // save painter state
painter->setTransform(QTransform(1, t.m12(), t.m13(),
t.m21(), 1, t.m23(), t.m31(),
t.m32(), t.m33()));
int x = 0, y = 0; // item's coordinates
painter->drawText(x*m11, y*m22, "Text"); // the text itself will not be scaled, but when the scene is transformed, this text will still anchor correctly
painter->restore(); // restore painter state
}
次のコードブロックは、デフォルトの変換で描画しています
void MyItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *item, QWidget *widget)
{
int x = 0, y = 0;
painter->drawText(x, y, "Text");
}
両方を試して違いを確認できます。お役に立てれば。