2011-07-21 91 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()信號斷開,並恢復滾動條位置

注意,這幾乎保證會導致一些閃爍/跳動。