Qt ensureVisible()在QScrollArea中不起作用

时间:2013-01-12 11:39:57

标签: qt drag-and-drop qscrollarea

我有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

此代码也显示相同的行为。我该怎么办这个帖子?我应该创建一个新的吗?

3 个答案:

答案 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毫秒,你明白了。)

我希望这可以帮助那些为同样的问题而斗争的人。