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
Forum Updated to NodeBB v4.3 + New Features

Working with Graphics View Framework and QSvgItem

Scheduled Pinned Locked Moved Solved General and Desktop
2 Posts 1 Posters 170 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