如何在调整大小期间保持视图中的相同场景部分?

时间:2014-08-14 08:06:14

标签: c++ qt qt5 qgraphicsview

我正在使用QGraphicsView来显示类似功能图的内容。 QGraphicsView在调整大小期间保持其变换,因此场景的可见部分会发生变化。

我需要在调整大小时保持视图完全相同 - 不需要保持宽高比,因为我允许在X和Y轴上进行独立缩放。

这不起作用:

void resizeEvent(QResizeEvent *event) override
{
    QRectF rect = mapToScene(this->viewport()->rect()).boundingRect();
    QGraphicsView::resizeEvent(event);
    fitInView(rect);
}

问题在于获得正确的视图矩形。此解决方案缩小了调整大小。

有没有一些简单的方法来实现这个目标?

4 个答案:

答案 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事件时,我们总是传递相同的场景坐标,而不会陷入更改循环中。