1

我有一个 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.
4

3 回答 3

1

我找到了解决方案。有必要覆盖 sizeHint 以保持滚动区域的滚动小部件。有必要为滚动小部件设置最大高度。并且有必要将此小部件放在 QVBoxLayout 中,并使用 addStretch() 将其推到顶部。

于 2013-03-05T17:32:06.807 回答
1

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

于 2013-01-13T23:06:57.000 回答
0

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

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

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

我想,这就是你需要的。

于 2013-01-10T06:20:49.310 回答