【问题标题】:Qt QVBoxLayout's addStretch strech is taking too much space (from the layout)Qt QHBoxLayout addStretch 拉伸占用了太多空间(来自布局)
【发布时间】:2012-12-24 07:20:19
【问题描述】:

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

【问题讨论】:

    标签: c++ python qt pyqt pyside


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 您能否举个例子来说明“覆盖 sizeHint 以保持滚动区域的滚动小部件”的含义?几个小时以来,我一直在寻找这个问题的答案!你看到了什么 (xkcd.com/979)?
      • 当然。创建一个继承自“QtGui.QWidget”的新类,因此本质上您正在创建一个新的小部件。定义一个名为“sizeHint”的类函数(这被称为“覆盖”,因为现在你的函数返回“sizeHint”,而不是“QWidget”的默认“sizeHint”函数。在这个函数中进行计算(比如计算字体大小,边距等然后返回“QtCore.QSize(宽度,高度)”(宽度和高度是您的计算结果。希望这会有所帮助。
      【解决方案3】:

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

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

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

      我想,这就是你需要的。

      【讨论】:

      • 你好@hank。感谢您的回答,但这不是我需要的。 ;-) 我不是在这里谈论滚动条。我说的是 QSCrollArea 的大小及其拉伸或收缩。如果可用空间为 100 且 QSA 的小部件为 100+,我希望 QSA 拥有所有空间。如果 QSA 的小部件小于可用空间,那么我希望 QSA 更小,并且要拉伸的空白空间,推动 QSA 对齐顶部。您可以从提供的代码中看到这一点。我认为这是一个 sizeHint 问题。你知道如何覆盖 size-hint 吗?
      • @Phil 我不明白你想使用 QSA 的方式。为什么要缩小 QSA 而不是缩小其内容?使用 QSA 的目的是,如果内容大于,则可以滚动内容。如果内容较小,则不需要 QSA 来缩小。如果需要,您可以将它们与 QSA 顶部对齐并隐藏滚动条。顺便说一句,如果您使用addStretch,则无论其他小部件有什么尺寸提示,布局中总会有一个空白区域。
      猜你喜欢
      • 2013-02-04
      • 2023-04-05
      • 1970-01-01
      • 2012-05-15
      • 1970-01-01
      • 2011-09-08
      • 1970-01-01
      • 2022-07-13
      • 1970-01-01
      相关资源
      最近更新 更多