2011-07-21 88 views
2

我在水平布局中有一个QGraphicsView。 QGraphicsScene中包含的QGraphicsScene相当大(数千像素),所以默认情况下显示的滚动条允许我滚动浏览视图。qt滚动查看位置

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

我试图在销毁场景之前先保存QGraphicsScene :: sceneRect,然后再做一个setSceneRect()以恢复它,但这不起作用,因为它只影响场景本身,而不是显示它的QGraphicsView。我也尝试做view-> verticalScrollBar() - > setValue(),但这似乎并不影响滚动条。

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

+1

更新到现场需要删除并重新创建它时发生了什么? –

回答

1

通过不删除前一个场景,直到设置新的场景。

例如

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; 
0

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

如果你真的需要保存/恢复滚动条的规定,下面的方法已经为我在过去的工作:

我不得不这样做(不同的原因)类似的东西,最好的解决方案我想出涉及做这样的事情:

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

注意,这几乎保证会导致一些闪烁/跳动。