如何在QGraphicsView中适配QGraphicsScene

12

我想把一个具有不同尺寸的QGraphicsScene适应到一个QGraphicsView中,使其根据视图的尺寸缩小或扩大,并且不应该出现任何滚动条。


这个回答解决了你的问题吗?Qt GraphicsView如何拉伸场景以适应 - Abderrahmene Rayene Mihoub
4个回答

12
这对我有用:
void MyGraphicsView::zoomToFit()
{
    fitInView(scene()->sceneRect(), Qt::KeepAspectRatio);
}

你可能想要调整场景矩形,留出一点余白;这样可能会更好看,取决于你的内容。

5
缩放视图如下所示,是必需的操作:
view->scale(frameWidth / sceneWidth, frameHeight / sceneHeight);

我该如何获取frameWidth/sceneWidth等? - Dariusz

4
view->setSceneRect(0, 0, view->frameSize().width(), view->frameSize().height());

将这段代码与QGraphicsViewresizeEvent连接起来。
如果你设置场景矩形的大小大于视图的大小,滚动条将出现。如果你将场景矩形设置为等于视图的框架宽度或更小,就不会有滚动条。
那么我猜QGraphicsView::fitInView()就是你的解决方案。

它只会重置sceneRect,即裁剪超出此矩形范围的额外部分,但不会缩小它。 - anj

0

我知道这并没有回答问题,但是当搜索如何将内容适应视图时,它出现在谷歌的顶部。简单来说:

def fit_contents(self):
    items = self.scene().items()
    rects = [item.mapToScene(item.boundingRect()).boundingRect() for item in items]
    rect = min_bounding_rect(rects)
    self.setSceneRect(rect)

min_bounding_rect 是什么:

def min_bounding_rect(rectList):
if rectList == []:
    return None

minX = rectList[0].left()
minY = rectList[0].top()
maxX = rectList[0].right()
maxY = rectList[0].bottom()

for k in range(1, len(rectList)):
    minX = min(minX, rectList[k].left())
    minY = min(minY, rectList[k].top())
    maxX = max(maxX, rectList[k].right())
    maxY = max(maxY, rectList[k].bottom())

return QRectF(minX, minY, maxX-minX, maxY-minY)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接