2

ユーザーがその中に青い正方形を作成できるようにするを使用して作成しましQGraphicsSceneた。mouseClickEventしかし、ユーザーがグラフィックシーンのスペースを使い果たしないように、アイテムが境界線に対して配置されたときにシーンを成長させたいと思います。

この場合、グラフィックシーンを大きくするための最良の方法は何ですか?

4

3 に答える 3

4

次のようなことをお勧めします。

  1. を使用して、シーン内のすべてのアイテムの境界を取得しQGraphicsScene::itemsBoundingRect()ます。
  2. アイテムの境界がビューの端に当たらないように、その四角形の周りにパディングを追加します。のようなものmyRect.adjust(-20, -20, 20, 20)で十分なはずです。
  3. QGraphicsView::fitInView(myRect, Qt::KeepAspectRatio)撮影した領域がビューの表示範囲内にあることを確認するために使用します。

それはそれをする必要があります。このコードは、シーンで何かが変更されたときに呼び出す必要があります。QRectF :: intersects()関数を使用して、新しい長方形がビューの端に配置されているかどうかを確認できます。

この場合、グラフィックシーンを大きくするための最良の方法は何ですか?

GraphicsSceneは、無限の座標系です。ほとんどのクライアントはitemsBoundingRect()、シーン内のアイテムが実際にどのくらいのスペースを使用しているかを把握するために使用します。シーンをクリアした場合は、QGraphicsScene::setSceneRect(QRectF())もう一度「小さくする」ために呼び出すことをお勧めします。

お役に立てば幸いです。

于 2010-11-21T11:45:04.113 に答える
1

これが少し遅い(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);
于 2017-02-21T08:19:17.583 に答える
0

私はそれが遅いことを知っていますが、ここでPythonコードを探している人のために:

class Scene(QtWidgets.QGraphicsScene):
    def __init__(self):
        super(Scene, self).__init__()
        self.setSceneRect(0, 0, 2000, 2000)

        self.sceneRect().adjust(-20, -20, 20, 20)
        self.old_rect = self.itemsBoundingRect()

    def adjust(self):
        w = self.sceneRect().width()
        h = self.sceneRect().height()
        x = self.sceneRect().x()
        y = self.sceneRect().y()
        adjust_factor = 500
        adjust_factor2 = 300

        smaller = self.is_smaller()
        self.old_rect = self.itemsBoundingRect()

        if not self.sceneRect().contains(self.old_rect):
            self.setSceneRect(-adjust_factor + x, -adjust_factor + y, adjust_factor + w, adjust_factor + h)

        if smaller:
            self.setSceneRect(adjust_factor2 + x, adjust_factor2 + y, abs(adjust_factor2 - w), abs(adjust_factor2 - h))

    def is_smaller(self):

        x = self.old_rect.x()
        y = self.old_rect.y()

        h = self.old_rect.height()
        w = self.old_rect.width()

        if ((x <= self.itemsBoundingRect().x()) and (y <= self.itemsBoundingRect().y())
                and (h > self.itemsBoundingRect().height()) and (w > self.itemsBoundingRect().width())):
            return True

        return False

説明

  1. が内にあるかどうかをself.sceneRect().contains(self.itemBoundingRect)確認し、内にない場合は、サイズを大きくするために使用します(注:上記のコードに示すように、必ず前のsceneRectに追加してください)。itemBoundingRectsceneRectsceneRectself.setSceneRect()sceneRect

  2. も減らしたい場合sceneRect。古いものitemBoundingRectを保存して新しいものと比較します。新しいitemSceneRect長方形が小さい場合は、サイズをいくつかの係数で減らします(上記のコードを参照してください)。

使用法

好きな場所からメソッドを呼び出すことができadjustます。adjust しかし、からメソッドを呼び出すことmouseReleaseEventは私にとって最もうまくいきました。

*ご提案やご質問がございましたら、コメントしていただけます。

于 2020-12-22T11:59:09.153 に答える