2

我有 2 列。其中一列充满了许多 QWidget。当我在列中放置一个小部件时,我调用此方法:

void MainWindow::scrollToItem(Product_View *item) {
    QPoint point = item->mapToParent(QPoint());
    ui->scrollArea->ensureVisible(point.x(), point.y());
}

当我在第一列的底部并在下一个中拖动一个小部件时。滚动区域正确滚动到底部,以便我可以看到我将其放置在哪里。

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

有谁能够帮我?

编辑:

也许很高兴知道我的布局。

我有一个带有QScrollArea. scrollArea 有一个QWidget被调用的scrollAreaWidgetContents,它有一个 QHBoxLayout。该小部件有 5 列。这些具有用于我的拖放小部件的 QVBoxLayout。

天哪,另一个编辑:

我注意到只有最后一项出错了。

我只是继续编辑

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

QScrollBar *bar = ui->scrollArea->verticalScrollBar();
bar->setValue(bar->maximum());

此代码也显示相同的行为。我应该怎么处理这个线程?我应该创建一个新的吗?

4

3 回答 3

1

我发现了我的问题。不是解决方案。

如果我将小部件拖回第一列,我的代码将调用ensureWidgetVisible. 之后,我的 scrollArea 由于新项目而调整大小。这就是为什么我的小部件不完全可见的原因。

于 2013-01-12T12:45:21.920 回答
1

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

希望有帮助!

于 2013-01-12T11:54:24.903 回答
1

尽管这是一篇较旧的帖子,但我遇到了同样的问题,并且给我寻找解决方案带来了很多麻烦。

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

我尝试过的事情是:
1.最好的方法)在 app 对象上调用 processEvents()。在看到这篇文章和拉齐安的回答后,我尝试了它。

2.实现您的自定义 ScrollArea,扩展QScrollArea并覆盖调整大小处理程序,以便能够在添加的小部件上调用 ensureWidgetVisible。当然,它需要以某种方式了解该小部件对象。

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

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

我希望这可以帮助那些遇到同样问题的人。

于 2016-08-03T22:12:41.713 回答