ユーザーがその中に青い正方形を作成できるようにするを使用して作成しましQGraphicsScene
た。mouseClickEvent
しかし、ユーザーがグラフィックシーンのスペースを使い果たしないように、アイテムが境界線に対して配置されたときにシーンを成長させたいと思います。
この場合、グラフィックシーンを大きくするための最良の方法は何ですか?
ユーザーがその中に青い正方形を作成できるようにするを使用して作成しましQGraphicsScene
た。mouseClickEvent
しかし、ユーザーがグラフィックシーンのスペースを使い果たしないように、アイテムが境界線に対して配置されたときにシーンを成長させたいと思います。
この場合、グラフィックシーンを大きくするための最良の方法は何ですか?
次のようなことをお勧めします。
QGraphicsScene::itemsBoundingRect()
ます。myRect.adjust(-20, -20, 20, 20)
で十分なはずです。QGraphicsView::fitInView(myRect, Qt::KeepAspectRatio)
撮影した領域がビューの表示範囲内にあることを確認するために使用します。それはそれをする必要があります。このコードは、シーンで何かが変更されたときに呼び出す必要があります。QRectF :: intersects()関数を使用して、新しい長方形がビューの端に配置されているかどうかを確認できます。
この場合、グラフィックシーンを大きくするための最良の方法は何ですか?
GraphicsSceneは、無限の座標系です。ほとんどのクライアントはitemsBoundingRect()
、シーン内のアイテムが実際にどのくらいのスペースを使用しているかを把握するために使用します。シーンをクリアした場合は、QGraphicsScene::setSceneRect(QRectF())
もう一度「小さくする」ために呼び出すことをお勧めします。
お役に立てば幸いです。
これが少し遅い(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);
私はそれが遅いことを知っていますが、ここで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
説明:
が内にあるかどうかをself.sceneRect().contains(self.itemBoundingRect)
確認し、内にない場合は、サイズを大きくするために使用します(注:上記のコードに示すように、必ず前のsceneRectに追加してください)。itemBoundingRect
sceneRect
sceneRect
self.setSceneRect()
sceneRect
も減らしたい場合sceneRect
。古いものitemBoundingRect
を保存して新しいものと比較します。新しいitemSceneRect
長方形が小さい場合は、サイズをいくつかの係数で減らします(上記のコードを参照してください)。
使用法:
好きな場所からメソッドを呼び出すことができadjust
ます。adjust
しかし、からメソッドを呼び出すことmouseReleaseEvent
は私にとって最もうまくいきました。
*ご提案やご質問がございましたら、コメントしていただけます。