Прежде всего, QGraphicsItem::boundingRect()
возвращает копию прямоугольника. Изменение не влияет на сам предмет. Чтобы изменить геометрию элемента, вам нужно переопределить эту функцию и вернуть другой прямоугольник. И позвоните prepareGeometryChange()
, когда вы действительно измените его.
Теперь, если все, что вам нужно, это поместить элемент в область просмотра QGraphicsView, используйте QGraphicsView::fitInView()
.
Изменение преобразования элемента очень отличается от изменения преобразования из сцены в представление. Первый изменяет способ размещения элемента на сцене по отношению к другим элементам. Последний сохраняет связь и влияет только на то, как сцена «отражается» на виде.
Не имеет большого значения, если у вас есть один предмет на сцене. Просто имейте в виду, что когда вы имеете дело с более сложной сценой, преобразование элементов имеет дело с математической моделью вашего мира, а не с тем, как его просматривать.
Edit:
Я просто перечитал твой код. Оказывается, вы неправильно рассчитали масштабный коэффициент. Вот основной, не проверенный код:
QRect itemSize = graphicsView->mapFromScene(item->sceneBoundingRect()).boundingRect().size();
QRect scaledSize =itemSize.scale(graphicsView->viewport().size(), Qt::KeepAspectRatio);
double ratio = qMin((double)scaledSize.width()/itemSize().width(), (double)scaledSize.height()/itemSize().height());
item->setTransform(QTransform::fromScale(ratio,ratio), true);
Смысл в том, чтобы использовать sceneBoundingRect
вместо boundingRect
, поскольку boundingRect
- это локальные границы элемента, которые всегда одинаковы независимо от преобразования элемента. И sceneBoundingRect - границы после того, как все transformations
применены.