qt获得scrollview位置

时间:2011-07-21 03:20:03

标签: qt layout scrollbars

我在水平布局中有一个QGraphicsView。 QGraphics场景中包含的QGraphicsScene非常大(数千个像素),因此默认情况下会显示滚动条以允许我滚动视图。

每次更新图形场景中的场景时,我都会删除旧场景,制作一个新场景,用对象填充它,然后调用view-> setScene(场景)。但是,当我这样做时,滚动条默认为QGraphicsView的左上角,而不是停留在它们所在的位置。

我在破坏场景之前尝试保存QGraphicsScene :: sceneRect,然后再执行setSceneRect()以恢复它,但这不起作用,因为它只影响场景本身,而不影响显示它的QGraphicsView。我也尝试过view-> verticalScrollBar() - > setValue(),但这似乎根本不会影响滚动条。

如何默认访问为我创建的滚动条,并将它们设置为之前存储的值?

2 个答案:

答案 0 :(得分:1)

通过在设置新场景之前不删除前一场景来修复。

e.g。

QGraphicsScene *previousScene = scene;
scene = new QGraphicsScene(0, 0, levelPlist.value("level_width").toInt(), levelPlist.value("level_height").toInt());

// config scene

QGraphicsView *view = ui->graphicsView;
view->setScene(scene);

delete previousScene;

答案 1 :(得分:0)

在我提供可能的解决方案之前,我强烈推荐一种不涉及破坏场景的方法。如果你只是清楚()你的场景,你应该能够在清除它之前调用setSceneRect(),这将阻止场景自动调整其矩形。当它重新填充时,您可以使用默认构造的QRect调用setSceneRect(),以便再次控制rect的大小。

如果您真的需要按照规定保存/恢复滚动条,以下方法对我有用:

我必须做类似的事情(出于不同的原因),我提出的最佳解决方案包括做这样的事情:

  • 在清除场景之前,请保存垂直和水平滚动条的位置
  • 在重建场景之前,使用排队信号/插槽连接连接到QScrollBar :: rangeChanged()信号。重新填充场景后,此信号应该被触发,并且表示视图已重新配置了滚动条。
  • 在您的插槽中,断开rangeChanged()信号,并恢复滚动条位置

请注意,这几乎可以保证会导致一些闪烁/跳跃。