Увеличение размера QGraphicsScene, когда графический элемент размещен за его границей - PullRequest
2 голосов
/ 21 ноября 2010

Я сделал QGraphicsScene с mouseClickEvent, который позволяет пользователю создавать синие квадраты внутри него. Но я хочу, чтобы сцена росла, когда элемент помещается за ее границу, чтобы у пользователя никогда не было свободного места на графической сцене.

Какой лучший способ увеличить графическую сцену в этом случае?

Ответы [ 2 ]

4 голосов
/ 21 ноября 2010

Я предлагаю сделать что-то вроде следующего:

  1. Получите ограничивающий прямоугольник для всех элементов сцены, используя QGraphicsScene::itemsBoundingRect().
  2. Добавьте несколько отступов вокруг этого прямоугольника, чтобы границы элементов не выходили за границы представления. Что-то вроде myRect.adjust(-20, -20, 20, 20) должно быть достаточно.
  3. Используйте QGraphicsView::fitInView(myRect, Qt::KeepAspectRatio), чтобы убедиться, что занятая область находится в пределах видимых границ вида.

Это должно сделать это. Этот код следует вызывать всякий раз, когда что-то меняется в сцене. Вы можете использовать функцию QRectF :: intersects (), чтобы узнать, был ли новый прямоугольник размещен на краю представления.

Какой лучший способ увеличить графическую сцену в этом случае?

GraphicsScene - это бесконечная система координат. Большинство клиентов будут использовать itemsBoundingRect(), чтобы понять, сколько места на самом деле используется предметами на сцене. Если вы очистили сцену, вы можете позвонить QGraphicsScene::setSceneRect(QRectF()), чтобы "сделать ее меньше" снова.

Надеюсь, это поможет.

1 голос
/ 21 февраля 2017

извините, если это немного поздно (6 лет), но я предоставлю ответ, если кто-то все еще борется с этим или хочет другой подход. Я реализую это в mouseReleaseEvent в пользовательском классе, полученном из QGraphicsObject. Обратите внимание, что я инициализирую размер моего QGraphicsScene (1000, 1000) следующим кодом. scene->setSceneRect(0,0,1000,1000). Итак, что будет делать мой код? Если Предмет (предмет перетаскиваемый) помещен против границы, эта граница увеличится. Так вот мой код:

void MyItem::mouseReleaseEvent(QgraphicsceneMouseEvent* event){
  QRectF tempRect = this->scene()->sceneRect();
  if(this->scenePos().y() < this->scene()->sceneRect().top()){
      tempRect.adjust(0,-200,0,0);
      if(this->scenePos().x() < this->scene()->sceneRect().left()){
          tempRect.adjust(-200,0,0,0);
      }
      else if(this->scenePos().x() + 200> this->scene()->sceneRect().right()){
        tempRect.adjust(0,0,200,0);
      }
  }
  else if(this->scenePos().y() + 200 > this->scene()->sceneRect().bottom()){
      tempRect.adjust(0,0,0,200);
      if(this->scenePos().x() < this->scene()->sceneRect().left()){
          tempRect.adjust(-200,0,0,0);
     }
     else if(this->scenePos().x() + 200> this->scene()->sceneRect().right()){
        tempRect.adjust(0,0,200,0);
     }
 }
 else if(this->scenePos().x() < this->scene()->sceneRect().left()){
      tempRect.adjust(-200,0,0,0);
      if(this->scenePos().y() < this->scene()->sceneRect().top()){
          tempRect.adjust(0,-200,0,0);
      }
      else if(this->scenePos().y() + 200 > this->scene()->sceneRect().bottom()){
          tempRect.adjust(0,0,0,200);
      }
  }
  else if(this->scenePos().x() + 200> this->scene()->sceneRect().right()){
      tempRect.adjust(0,0,200,0);
      if(this->scenePos().y() < this->scene()->sceneRect().top()){
          tempRect.adjust(0,-200,0,0);
      }
      else if(this->scenePos().y() + 200 > this->scene()->sceneRect().bottom()){
          tempRect.adjust(0,0,0,200);
      }
  }

  this->scene()->setSceneRect(tempRect);
...