2013-01-12 46 views
2

我有2列。其中一列填充了大量QWidgets。 当我在一列拖放一个widget我调用这个方法:Qt ensureVisible()在QScrollArea中不起作用

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

当我在第一列的底部,我的下一个拖一个小部件。 Scrollarea正确地滚动到底部,以便我可以看到我放下它的位置。

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

任何人都可以帮助我吗?

编辑:

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

我有一个主窗口QScrollArea。 scrollArea有一个QWidget,叫做scrollAreaWidgetContents,它有一个QHBoxLayout。 小部件有5列。而且这些对我的拖放小部件有QVBoxLayout。

哎呀ANOTHER编辑:

我注意到那就只错的最后一个项目。

我只是继续编辑

现在很清楚,我认为滚动条只是不会一路下滑。

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

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

回答

1

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

希望有帮助!

+0

感谢您的回复。你正确的使用'ensureWidgetVisible'。但我之前做过这些,结果相同。 – HansElsen

1

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

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

1

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

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

我尝试的事情是:
的最佳方式)来调用processEvents()的应用程序对象。我在看到this后和ratzian的回答后试过了。

2.实现自定义ScrollArea,扩展QScrollArea和覆盖调整大小处理程序能够调用ensureWidgetVisible上添加小部件。当然,它不知何故需要知道该小部件对象。

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

我知道3是有点hacky,因为它不知道什么时候发生了resize事件,所以定时器需要设置为次优值。 (例如调整大小在33毫秒内调用,并将计时器设置为500毫秒,您就会明白)。

我希望这能够帮助那些为同样问题而奋斗的人们。