Я попал в ту же проблему, и мне потребовалось время, чтобы понять это. Вот как я это решил.
Расширить класс 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(m11, 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");
}
Вы можете попробовать оба варианта, чтобы увидеть разницу. Надеюсь это поможет.