Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Working with Graphics View Framework and QSvgItem
Qt 6.11 is out! See what's new in the release blog

Working with Graphics View Framework and QSvgItem

Scheduled Pinned Locked Moved Solved General and Desktop
2 Posts 1 Posters 374 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • C Offline
    C Offline
    claud84 0
    wrote on last edited by claud84 0
    #1

    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);
    }
    

    capture svg drawing rescale demo.gif

    1 Reply Last reply
    0
    • C Offline
      C Offline
      claud84 0
      wrote on last edited by claud84 0
      #2

      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();
          });
      

      capture svg drawing rescale demo.gif

      If you have any other suggestions or ideas please feel free to comment.

      1 Reply Last reply
      0
      • C claud84 0 has marked this topic as solved on

      • Login

      • Login or register to search.
      • First post
        Last post
      0
      • Categories
      • Recent
      • Tags
      • Popular
      • Users
      • Groups
      • Search
      • Get Qt Extensions
      • Unsolved