Qt QVBoxLayout的addStretch strech占用了太多空间(从布局)

Qt QVBoxLayout's addStretch strech is taking too much space (from the layout)

本文关键字:空间 太多 布局 QVBoxLayout addStretch strech Qt      更新时间:2023-10-16

我有一个QVBoxLayout,它有一个QSCrollArea和addStretch()添加到它的末尾。

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.

我刚刚遇到了同样的问题,我想我找到了一个解决方案。不要在QScrollArea之后添加拉伸,而是作为QScrollArea布局内的最后一个元素。因此,在您的代码中,使用self.scrollLayout.addStretch()而不是self.layout.addStretch()

我找到了解决方案。有必要重写sizeHint来保持scrollarea的滚动小部件。设置滚动小部件的最大高度是必要的。有必要将这个小部件放置在QVBoxLayout中,并使用addStretch()将其推到顶部。

当QScrollArea的内容较小时,我希望QScrollArea缩小到该大小,剩余可用空间由addStetch使用。

如果QScrollArea的内容很小,您可以将它们对齐到顶部并隐藏垂直滚动条。在这种情况下,你不需要在主垂直布局中添加拉伸。

如果内容大于QScrollArea,它将占用所有可用空间。

我想,这就是你需要的。