Как мне оставаться в той же позиции прокрутки при добавлении элементов в Qt?

У меня есть QScrollArea, который содержит QWidget с QVBoxLayout. Я хочу реализовать бесконечную прокрутку, при которой, когда вы дойдете до конца прокрутки на 80%, он загружает больше элементов, чтобы вы могли прокручивать еще больше.

Проблема в том, что когда я добираюсь до 80% и пытаюсь добавить больше элементов в QVBoxLayout, все элементы сдвигаются вверх, так что вы видите все новые элементы. Как заставить QScrollArea оставаться в том же относительном месте, пока добавляются новые элементы?


person chacham15    schedule 09.09.2012    source источник
comment
Должны ли эти элементы быть виджетами? Рассматривали ли вы возможность использования QAbstractListModel и QListView? Это будет лучше масштабироваться, если у вас много предметов.   -  person Frank Osterfeld    schedule 09.09.2012


Ответы (2)


Сохраните абсолютную позицию перед добавлением элементов, а затем восстановите ее после добавления элементов. Вот так (не проверено). Поведение по умолчанию, по-видимому, сохраняет относительное положение, а это именно то, чего вы не хотите.

Обратите внимание, что это работает, только если вы добавляете элементы.

void code() {
  //...
  QScrollBar * bar; 
  const int savedPos = bar->value();
  // add items here
  bar->setValue(savedPos);
  //...
}
person Kuba hasn't forgotten Monica    schedule 09.09.2012
comment
Это также непроверенный комментарий, но не будет ли панель ненадежной после добавления N новых элементов? Как насчет того, чтобы просто проверить положение дочернего виджета и снова перейти к этому последнему виджету? - person jdi; 09.09.2012
comment
Эта идея не работает. Подумайте, что это значит. По сути, это говорит о том, что ползунок должен оставаться на одном и том же месте на панели. Это неверно, потому что, поскольку новые элементы добавляются ниже, расположение старых элементов перемещается вверх, поэтому ползунок также должен перемещаться вверх. - person chacham15; 09.09.2012
comment
Возможно, я сделал это немного сверх меры. Тогда будет работать обратное: сохранение и восстановление абсолютной позиции. Я обновил ответ. - person Kuba hasn't forgotten Monica; 10.09.2012

Это соответствует комментарию jdi: я использовал значение QScrollBar, чтобы получить текущую позицию QScrollArea, затем я просмотрел QLayout и проверил QLayoutItem->geometry() каждого дочернего элемента, чтобы увидеть, какой дочерний элемент был ближе всего к вершине . Затем, после вставки, я сделал QWidget->geometry(), чтобы получить высоту этого элемента, а затем QScrollBar->setValue() для прокрутки до этого места.

person chacham15    schedule 09.09.2012