我有一个 QScrollArea,其中包含一个 QWidget,它有一个 QVBoxLayout。我想实现一个无限滚动,当你到达滚动底部的 80% 时,它会加载更多项目,这样你就可以滚动更多。
问题是当我达到 80% 并尝试向 QVBoxLayout 添加更多项目时,所有项目都会上移,以便您看到所有新项目。添加新项目时,如何让 QScrollArea 保持在相同的相对位置?
我有一个 QScrollArea,其中包含一个 QWidget,它有一个 QVBoxLayout。我想实现一个无限滚动,当你到达滚动底部的 80% 时,它会加载更多项目,这样你就可以滚动更多。
问题是当我达到 80% 并尝试向 QVBoxLayout 添加更多项目时,所有项目都会上移,以便您看到所有新项目。添加新项目时,如何让 QScrollArea 保持在相同的相对位置?
添加项目前保存绝对位置,添加项目后恢复。像这样(未经测试)。默认行为显然保留了相对位置,而这正是您不想要的。
请注意,这仅在您附加项目时才有效。
void code() {
//...
QScrollBar * bar;
const int savedPos = bar->value();
// add items here
bar->setValue(savedPos);
//...
}
这与 jdi 的评论一致:我使用 QScrollBar 的值来获取 QScrollArea 的当前位置,然后我循环遍历 QLayout 并检查每个孩子的 QLayoutItem->geometry() 以查看哪个孩子最接近顶部. 然后,在我插入之后,我执行 QWidget->geometry() 以获取该项目的高度,然后执行 QScrollBar->setValue() 以滚动到该位置。