Qt получить позицию прокрутки - PullRequest
2 голосов
/ 21 июля 2011

У меня есть QGraphicsView внутри горизонтального макета. QGraphicsScene, содержащийся в сцене QGraphics, довольно большой (тысячи пикселей), поэтому полосы прокрутки отображаются по умолчанию, чтобы я мог прокручивать представление.

Каждый раз, когда я обновляю сцену внутри графической сцены, я удаляю старую сцену, создаю новую, заполняю ее объектами и вызываю view-> setScene (scene). Однако, когда я делаю это, полосы прокрутки по умолчанию направляются в верхний левый угол QGraphicsView, а не остаются там, где они были.

Я попытался сохранить QGraphicsScene :: sceneRect перед тем, как уничтожить сцену, а затем выполнить setSceneRect () для ее восстановления, но это не работает, поскольку это влияет только на саму сцену, а не на QGraphicsView, который ее отображает. Я также попытался сделать view-> verticalScrollBar () -> setValue (), но это никак не влияет на полосы прокрутки.

Как получить доступ к полосам прокрутки, которые созданы для меня по умолчанию, и установить для них значение, которое было сохранено ранее?

Ответы [ 2 ]

1 голос
/ 21 июля 2011

Исправлена ​​ошибка, из-за которой предыдущая сцена не удалялась до тех пор, пока не установлена ​​новая.

Например,

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 голосов
/ 21 июля 2011

Прежде чем дать возможное решение, я очень рекомендую подход, который не предполагает разрушение вашей сцены.Если вы просто очистили () вашу сцену, вы должны иметь возможность вызвать setSceneRect () перед ее очисткой, что помешает сцене автоматически изменить размер прямоугольника.После его заполнения вы можете вызвать setSceneRect () с созданным по умолчанию QRect, чтобы снова контролировать размер прямоугольника.

Если вам действительно необходимо сохранить / восстановить прокруткуКак уже говорилось, в прошлом у меня работал следующий подход:

Мне пришлось сделать что-то подобное (по разным причинам), и лучшее решение, которое я придумала, заключается в том, чтобы сделать что-то вроде этого:

  • Перед очисткой сцены сохраните позиции вертикальных и горизонтальных полос прокрутки
  • Перед восстановлением сцены подключитесь к сигналу QScrollBar :: rangeChanged () с помощью поставленный в очередь соединение сигнал / слот.Этот сигнал должен сработать после повторного заполнения сцены, и это указывает на то, что полосы прокрутки были переконфигурированы представлением.
  • В вашем слоте отключите сигнал rangeChanged () и восстановите полосу прокрутки.позиции

Обратите внимание, что это почти наверняка вызовет некоторое мерцание / скачок.

...