QGraphicsView在缩放pixmap后不调整大小,且pixmap偏离中心

2 投票
2 回答
2005 浏览
提问于 2025-04-18 03:55

我创建了一个QGraphicsView(图形视图),里面有一个QGraphicsScene(图形场景)。我在这个图形场景里加载了一张图片。其实这是一个继承自QGraphicsScene的类,它实现了一个叫做wheelEvent的功能,用来做缩放。缩放功能是根据鼠标滚轮的转动来放大或缩小图片,放大或缩小的幅度是10%。这个缩放功能运行得很好,但有个问题,就是QGraphicsView的大小或者QGraphicsScene的大小会变成你尝试缩放时的最大值,而不再是居中的状态。例如,如果我用滚轮放大了图片,导致出现了滚动条,那么当我再缩小图片时,滚动条依然存在,而图片却跑到了左上角。

补充说明:我不使用QGraphicsView的缩放功能,因为它会生成低质量的图片。我是添加了一张已经缩放过的图片,并且在每次滚动时再次缩放并显示到图形视图上。不过,正如之前提到的,图形视图或图形场景的大小在调整时会出现问题。

2 个回答

0

不要去继承 QGraphicsScene 这个类。你应该继承 QGraphicsView 来处理滚轮事件,并相应地改变视图的变换。可以使用 setTransform 来设置图形视图的世界变换。

这样做是正确的。从概念上讲,场景中的物体大小是不会改变的。改变的是你的视图,你是在放大或缩小。就像是相机在移动,而不是物体在变大或变小。

你可以在物体的绘制方法中使用 细节级别,根据缩放因子来绘制高分辨率或低分辨率的图像。

还有一个很不错的 演示,里面有4000个芯片,展示了如何使用细节级别。

3

经过一段时间,我终于找到了问题的解决办法。问题在于场景的大小没有跟着图片的大小变化。举个例子,当我在滚动的时候,创建了一个很大的图片,这时候需要出现滚动条;但是如果我在滚动的同时又创建了一个小的图片,滚动条依然会存在,因为场景的大小没有改变。不过,我找到了解决这个问题的方法,就是在添加新的图片后,设置场景的大小。所以在 wheelEvent (self, event) 这个函数里,在用 self.clear() 清空场景并添加新的缩放图片之后,场景的大小也需要改变。为此,我使用了下面的命令,其中 self.__size 是新的缩放图片的大小。

self.setSceneRect(QtCore.QRectF(0.0, 0.0, self.__size.width(), self.__size.height()))

撰写回答