我用a 制作了QGraphicsScene
一个mouseClickEvent
,让用户在其中创建蓝色方块。但是我想在将项目放在其边框上时使场景增长,以便用户永远不会用完图形场景上的空间。
在这种情况下,使图形场景更大的最佳方法是什么?
我用a 制作了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)
检查 是否itemBoundingRect
在 中sceneRect
,如果不在sceneRect
则使用self.setSceneRect()
增加sceneRect
大小(注意:确保添加到之前的 sceneRect 中,如上面的代码所示)。
如果你还想减少sceneRect
. 存储旧的itemBoundingRect
并将其与新的进行比较,如果新的itemSceneRect
Rectangle 较小,则将大小减小一些(参考上面的代码)。
用法:
adjust
您可以从任何您喜欢的地方调用该方法。但是调用adjust
from 的方法mouseReleaseEvent
对我来说效果最好。
*如果您有任何建议或疑问,您可以发表评论。