Working with Graphics View Framework and QSvgItem
Solved
General and Desktop
-
Can someone please help me figure this one out.
I am working with the Graphics View Framework and
the end goal is to load an svg drawing re-scale it to fit the view port and rotate it around the center of the view port while also maintaining it's center aligned with the view port's center.I have this setup:
MyQWidget::MyQWidget(QWidget *parent) : QWidget{parent} { //... QObject::connect(action1, &QAction::triggered, [&]() { svgItem->setTransformOriginPoint(svgItem->boundingRect().center()); svgItem->setRotation(rotation+=45); centerSVGItem(); scene->update(); }); //... } void MyQWidget::resizeEvent(QResizeEvent *event) { scene->setSceneRect(view->viewport()->rect()); qreal scaleX = qBound(0.1, static_cast<qreal>(view->viewport()->rect().width()) / svgItem->boundingRect().width(), 0.9); qreal scaleY = qBound(0.1, static_cast<qreal>(view->viewport()->rect().height()) / svgItem->boundingRect().height(), 0.9); centerPoint = scene->sceneRect().center(); svgItem->setScale(qMin(scaleX,scaleY)); centerSVGItem(); } void MyQWidget::centerSVGItem() { svgItem->setTransformOriginPoint(svgItem->boundingRect().topLeft()); QPointF svgCenter = svgItem->boundingRect().center() * svgItem->scale(); QPointF sceneCenter = scene->sceneRect().center(); QPointF offset = sceneCenter - svgCenter; svgItem->setPos(offset); }
-
So I asked chat GPT and it gave some suggestion that seem to work:
void centerSVGItem() { QRectF transformedBoundingRect = svgItem->sceneTransform().mapRect(svgItem->boundingRect()); QPointF svgCenter = transformedBoundingRect.center(); QPointF sceneCenter = scene->sceneRect().center(); QPointF offset = sceneCenter - svgCenter; svgItem->setPos(svgItem->pos() + offset); }; //... QObject::connect(action1, &QAction::triggered, [&]() { QRectF transformedBoundingRect = svgItem->sceneTransform().mapRect(svgItem->boundingRect()); svgItem->setTransformOriginPoint(transformedBoundingRect.center()); svgItem->setRotation(rotation += 45); centerSVGItem(); scene->update(); });
If you have any other suggestions or ideas please feel free to comment.
-