我正在使用QGraphicsView
来显示类似功能图的内容。 QGraphicsView
在调整大小期间保持其变换,因此场景的可见部分会发生变化。
我需要在调整大小时保持视图完全相同 - 不需要保持宽高比,因为我允许在X和Y轴上进行独立缩放。
这不起作用:
void resizeEvent(QResizeEvent *event) override
{
QRectF rect = mapToScene(this->viewport()->rect()).boundingRect();
QGraphicsView::resizeEvent(event);
fitInView(rect);
}
问题在于获得正确的视图矩形。此解决方案缩小了调整大小。
有没有一些简单的方法来实现这个目标?
答案 0 :(得分:1)
我遇到了完全相同的问题。当大小发生变化时,您需要手动scale
视图,并恢复旧的中心点。在python:
def resizeEvent(self, event):
w_ratio = self.rect().width() / event.oldSize().width()
h_ratio = self.rect().height() / event.oldSize().height()
self.scale(w_ratio, h_ratio)
self.centerOn(self.old_center)
您显然需要提前设置self.old_center
,例如在showEvent()
。如果用户可以翻译视图,则还需要更新self.old_center
中的mouseReleaseEvent()
。
def showEvent(self, event):
self.old_center = self.mapToScene(self.rect().center())
def mouseReleaseEvent(self, event):
super(MyView, self).mouseReleaseEvent(event)
self.old_center = self.mapToScene(self.rect().center())
答案 1 :(得分:0)
制作继承自QGraphicsView
的自定义类后,您应该在自定义resizeEvent( QResizeEvent *event )
中重新实现QGraphicsView
,如:
void MyView::resizeEvent(QResizeEvent *event)
{
QRectF rect = this->scene()->itemsBoundingRect();
fitInView(rect);
QGraphicsView::resizeEvent(event);
}
这样,视图将始终显示整个场景。即如果更改了窗口大小并调整了graphicsView的大小,则场景会缩放,您可以正确地看到所有内容。
答案 2 :(得分:0)
如何使用fitInView
?
void resizeEvent(QResizeEvent *event) override
{
QGraphicsView::resizeEvent(event);
fitInView(this->sceneRect());
}
答案 3 :(得分:0)
我意识到这已经很老了,但是我遇到了同样的挑战,并且找到了一个行之有效的解决方案。
我认为问题是在resize事件中,视口坐标(映射到场景)正在获取。在这种情况下,视口已经更改(因此显示的场景也已更改),然后使用一些稍微更新的场景坐标调用fitInView
,因此显示场景实际上发生了更改。这会变成类似层叠的效果。
我们想要做的是始终在调整大小事件期间将相同场景传递给fitInView
。我可以通过在第一次加载图像时本地存储场景坐标,然后在任何时候更改显示的场景(平移/缩放/重置视图等)来实现此目的。然后,在调用resize事件时,我们总是传递相同的场景坐标,而不会陷入更改循环中。