Qt EnsureRevible()不在QScrollara中工作

Qt EnsureRevible()不在QScrollara中工作,qt,drag-and-drop,qscrollarea,Qt,Drag And Drop,Qscrollarea,我有两个专栏。其中一列充满了大量的QWidget。 当我在列中删除一个小部件时,我称之为此方法: void MainWindow::scrollToItem(Product_View *item) { QPoint point = item->mapToParent(QPoint()); ui->scrollArea->ensureVisible(point.x(), point.y()); } 当我在第一列的底部,并在下一列中拖动一个小部件时。滚动区域正确地

我有两个专栏。其中一列充满了大量的QWidget。 当我在列中删除一个小部件时,我称之为此方法:

void MainWindow::scrollToItem(Product_View *item) {
    QPoint point = item->mapToParent(QPoint());
    ui->scrollArea->ensureVisible(point.x(), point.y());
}
当我在第一列的底部,并在下一列中拖动一个小部件时。滚动区域正确地滚动到底部,这样我就可以看到我把它放在哪里了

但是当我把小部件放回第一列时,它会滚动,但不会完全滚动到底。它的大小大约为150px(编辑:150px不是真的。我只看到大约5px的小部件)

有人能帮我吗

编辑:

也许知道我的布局很好

我有一个带有
QScrollArea
的主窗口。 scrollArea有一个名为
scrollAreaWidgetContents
QWidget
,它有一个QHBoxLayout。 小部件有5列。这些有QVBoxLayout用于我的拖放小部件

天哪,另一个编辑:

我注意到只有最后一项出了问题

我只是继续编辑

现在我很清楚,滚动条并没有一直向下

QScrollBar *bar = ui->scrollArea->verticalScrollBar();
bar->setValue(bar->maximum());
此代码也显示了相同的行为。我该怎么处理这根线?我应该创建一个新的吗?

这个函数只需要一个点,所以使用它只能保证小部件的一个角是可见的(我相信是左上角吧?)。尝试改用-这应该确保整个小部件都显示在屏幕上


希望有帮助

我发现了我的问题。不是解决办法

如果我将小部件拖回第一列,我的代码将调用
ensureWidgetVisible

之后,我的滚动区域会因为新项目而调整大小。这就是为什么我的小部件不完全可见的原因。

虽然这是一篇较旧的帖子,但我遇到了同样的问题,这给我找到解决方案带来了很多困难

我的问题是: 必须在小部件中添加新行,然后确保滚动条向下滚动,以便人们查看。OP在他的回答中很好地描述了这个问题

我尝试过的是:
1。对应用程序对象调用processEvents()的最佳方法)。在看到波斯特和拉齐安的回答后,我试了一下

2。实现自定义滚动区域,该区域扩展
QScrollArea
并覆盖调整大小处理程序,以便能够在添加的小部件上调用ensureWidgetVisible。当然,它需要知道这个小部件对象

3.添加
QTimer
并在添加新小部件时启动计时器。计时器调用的方法需要在新小部件对象上调用ensureWidgetVisible(),然后停止计时器

我知道3有点不对劲,因为它不知道调整大小事件何时发生,所以需要将计时器设置为次优值。(例如,在33毫秒内调用resize,将计时器设置为500毫秒,您就知道了)


我希望这能帮助那些与同样问题作斗争的人。

谢谢你的回复。关于使用
ensureWidgetVisible
,您是对的。但我以前也这么做过,结果也一样。