如何在调整大小时保持相同的场景部分



我使用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事件被调用时,我们总是传递相同的场景坐标,而不会陷入变化循环。

相关内容

  • 没有找到相关文章

最新更新