我有2列。其中一列充满了许多QWidgets。 当我在一个列中删除一个小部件时,我称之为:
void MainWindow::scrollToItem(Product_View *item) {
QPoint point = item->mapToParent(QPoint());
ui->scrollArea->ensureVisible(point.x(), point.y());
}
当我在第一列的底部时,我在下一个列中拖动一个小部件。 scrollarea正确滚动到底部,以便我可以看到我放下它的位置。
但是当我将小部件放回第一列时,它会滚动但不会完全滚动到底部。它大约150px(编辑:150px不是真的。我只看到大约5px的Widget)
有人能帮助我吗?
编辑:
也许很了解我的布局。
我有一个QScrollArea
的主窗口。
scrollArea有一个名为QWidget
的{{1}},它有一个QHBoxLayout。
小部件有5列。对于我的拖放小部件,这些都有QVBoxLayout。
JEEZ另一个编辑:
我注意到最后一项只会出错。
我只是继续编辑
现在我很清楚滚动条不会一直向下。
scrollAreaWidgetContents
此代码也显示相同的行为。我该怎么办这个帖子?我应该创建一个新的吗?
答案 0 :(得分:1)
ensureVisible函数只需要一个点,因此使用它只能保证窗口小部件的一个角可见(左上角,我相信?)。尝试使用ensureWidgetVisible代替 - 这应该确保整个小部件在屏幕上显示。
希望有所帮助!
答案 1 :(得分:1)
我发现了我的问题。不是解决方案。
如果我将小部件拖回第一列,我的代码会调用ensureWidgetVisible
。
之后,我的scrollArea因为新项目而调整大小。这就是为什么我的小部件不完全可见。
答案 2 :(得分:1)
虽然这是一篇较旧的帖子,但我遇到了同样的问题,但是在找到解决方案时遇到了很多麻烦。
我的问题: 不得不在窗口小部件中添加一个新行,然后确保滚动条向下滚动到它以便人们查看它。 OP在他的回答中很好地描述了这个问题。
我尝试过的事情是:
1。(最佳方式)在app对象上调用processEvents()。我在看到this帖子和ratzian的回答后尝试了。
2. 实现自定义ScrollArea,扩展QScrollArea
并覆盖调整大小处理程序,以便能够在添加的小部件上调用ensureWidgetVisible。当然,它需要知道该小部件对象。
3。添加QTimer
并在添加新窗口小部件时启动计时器。计时器调用的方法需要在新的widget对象上调用ensureWidgetVisible(),然后停止计时器。
我知道3有点hacky,因为它不知道何时发生resize事件,因此需要将计时器设置为次优值。 (例如调整大小在33毫秒内调用,你将定时器设置为500毫秒,你明白了。)
我希望这可以帮助那些为同样的问题而斗争的人。