2013-01-12 65 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毫秒,您就會明白)。

我希望這能夠幫助那些爲同樣問題而奮鬥的人們。