我使用QGraphicsView
来显示函数图之类的东西。QGraphicsView
在调整大小期间保持其变换,因此场景的可见部分发生变化。
我需要在调整大小期间保持视图完全相同-宽高比不必保持,因为我允许在X和Y轴上独立缩放。
这行不通:
void resizeEvent(QResizeEvent *event) override
{
QRectF rect = mapToScene(this->viewport()->rect()).boundingRect();
QGraphicsView::resizeEvent(event);
fitInView(rect);
}
问题是在获得正确的视图矩形。此解决方案在调整大小时缩小。
是否有一些简单的方法来实现这一点?
我遇到了完全相同的问题。当视图的大小发生变化时,您需要手动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()
中。如果视图可以被用户翻译,您还需要在mouseReleaseEvent()
中更新self.old_center
。
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())
在fitInView
视图中保持这个视图可视化的场景矩形如何?
void resizeEvent(QResizeEvent *event) override
{
QGraphicsView::resizeEvent(event);
fitInView(this->sceneRect());
}
我知道这是相当古老的,但我遇到了同样的挑战,并找到了一个行之有效的解决方案。
我认为问题是,在调整大小事件,视口坐标(映射到场景)正在被提取。在这种情况下,视口已经改变了(因此显示的场景),然后fitInView
调用一些稍微更新的场景坐标,因此显示场景实际上发生了变化。这就变成了级联效应。
我们要做的就是在调整大小事件期间始终将相同的场景直接传递给fitInView
。当我第一次加载图像时,我能够通过本地存储场景坐标来实现这一点,然后在任何时候显示场景变化(平移/缩放/重置视图等)。然后,当resize事件被调用时,我们总是传递相同的场景坐标,而不会陷入变化循环。