2013-01-10 38 views
1

我有一個QVBoxLayout,它有一個QSCrollArea並在其末尾添加了addStretch()。Qt QVBoxLayout的addStretch strech佔用太多空間(來自佈局)

QScrollArea在這裏只能使用一半的可用空間事件,儘管下面有空閒空間,現在被addStretch佔用。

如果QScrollArea的內容足夠大,我希望QScrollArea擴展到所有可用空間。當QScrollArea的內容較小時,我希望QScrollArea縮小到該大小,其餘的可用空間由addStetch使用。

但是,目前,對於小型QScrollArea來說這可以工作,但是當QScrollArea的內容較大時,它只擴展到可用空間的一半。

我試着設置QScrollArea和底層滾動窗口小部件的各種尺寸策略,但沒有任何工作。

讓這個排序的技巧是什麼?

這裏是我的代碼[在Python,但答案在C++中是非常歡迎]一個文檔片斷:

# My setup 
self.layout = QVBoxLayout() 
self.setLayout(self.layout) 

scrollArea = QScrollArea() 
self.layout.addWidget(scrollArea) 
scrollArea.setWidgetResizable(True) 
scrollArea.setEnabled(True) 

self.scrollWidget = QWidget() 
self.scrollLayout = QVBoxLayout() 
self.scrollWidget.setLayout(self.scrollLayout) 

scrollArea.setWidget(self.scrollWidget) 

# Now what I do is, I add bunch of widgets inside the self.scrollLayout 
# and in the end, I perform a self.layout.addStretch() to push them up (verticle Alignment does same) 
# Maximum height QScrollArea (scrollArea) gets is stuck at around 50% although I want to take all the space if necessary 

我添加了所有可能的setSizePolicy(..)選項

scrollArea.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)) 
# and ALL others. None works. addStretch() still takes 50% minimum space and gets even more if QScrollArea's contents are smaller. 

回答

1

我找到了解決方案。 必須重寫sizeHint來保存Scrollarea的滾動窗口部件。 有必要設置滾動窗口小部件的最大高度。 有必要將這個小部件放入一個帶有addStretch()的QVBoxLayout中,這會將它推到頂部。

+0

你可以用你的意思是「覆蓋sizeHint來保存scrollarea的滾動小部件」來改進這個答案嗎?我一直在尋找這個問題的答案几個小時!你看到了什麼(https://xkcd.com/979/)? – Assimilater

+1

當然。創建一個從「QtGui.QWidget」繼承的新類,所以基本上你正在創建一個新的Widget。定義一個名爲「sizeHint」的類函數(這被稱爲「覆蓋」,因爲現在你的函數返回「sizeHint」,而不是「QWidget」的默認「sizeHint」函數)在這個函數中進行計算(比如計算字體大小,邊距等等然後返回「QtCore.QSize(寬度,高度)」(寬度和高度是你的計算結果。希望這有助於。 – Phil

0

當QScrollArea的內容更小,我希望QScrollArea將 縮小到該大小,其餘的可用空間由addStetch使用。

如果QScrollArea的內容很小,可以將它們對齊到頂部並隱藏垂直滾動條。在這種情況下,您不需要將拉伸添加到主垂直佈局。

如果內容大於QScrollArea,它將佔用所有可用空間。

我想,這是你需要的。

+0

Hello @hank。感謝您的答案,但這不是我所需要的。 ;-)我不是在說滾動條。我正在談論QSCrollArea的規模及其伸展或縮小。如果可用空間爲100且QSA的小部件爲100+,我希望QSA擁有所有空間。如果QSA的小部件小於可用空間,那麼我希望QSA更小,並且需要空閒空間來擴展,將QSA推向頂部。你可以從提供的代碼中看到這一點。我認爲這是一個尺寸提示問題。你知道如何覆蓋size-hint嗎? – Phil

+0

@Phil我不明白你想用QSA的方式。你爲什麼要QSA縮小,但不是其內容?使用QSA的重點在於,如果內容大於容器,可能會滾動瀏覽內容。如果內容爲_smaller_,則不需要QSA縮小。您可以將它們對齊到QSA的頂部,並根據需要隱藏滾動條。順便說一句,如果你做'addStretch',佈局中總是會有一個空的空間,不管其他小部件有多大。 – hank

1

我只是有同樣的問題,我想我找到了解決方案。不要在QScrollArea之後添加拉伸,而是在QScrollArea佈局中添加最後一個元素。所以在你的代碼中,使用self.scrollLayout.addStretch()而不是self.layout.addStretch()