我有QWidget和QVBoxLayout在QScrollArea内,如下所示:
self.vbox = QVBoxLayout()
self.widget = QWidget()
self.widget.setLayout(self.vbox)
self.scroll = QScrollArea()
self.scroll.setWidget(self.widget)
最初我在这个卷轴中有四个按钮:
# ...Method to insert four buttons...
self.vbox.addStretch()
这会将所有 4 个按钮保留在滚动区域的顶部,但如果我需要在程序启动后插入另外四个按钮,我会这样做:
# ...Method to insert four buttons...
self.vbox.addStretch()
# ...Method to insert another four buttons...
我明白了:
但我想要另外四个按钮也粘在顶部。有没有正确的方法来做到这一点?
标准 Qt 布局管理器使用 QLayoutItems 作为用于布局所有内容的通用抽象对象。这些项目对象可以是小部件、嵌套布局或stretch项目。
对于布局管理器来说,它们基本上以相同的方式处理,因此间隔项 (QSpacerItem) 与任何其他项具有相同的重要性。
改变的是它的大小策略,即根据其拉伸因子对 addStretch()
进行
expanding。默认因子为 0,这意味着如果布局中没有其他项目具有扩展方向,它将尝试尽可能扩展。
如果您在垂直布局的底部添加了一个拉伸项目(可能遵循我自己的建议),您需要考虑向布局添加另一个项目:每当您添加其他项目(例如使用
addWidget()
的小部件)时它们将被附加到拉伸之后。
因此,如果您想在添加其他项目时将小部件 pushed 保持在顶部,同时尊重底部间隔符,则必须考虑其索引,该索引始终等于
layout.count() - 1
。这与 Python list.insert()
函数类似。
# upon initialization
self.scrollContentLayout.addWidget(someWidget)
...
self.scrollContentLayout.addStretch()
# when called to add further widgets
indexOfSpacer = self.scrollContentLayout.count() - 1
self.scrollContentLayout.insertWidget(indexOfSpacer, anotherWidget)
另一种类似的可能性是跟踪添加的间隔项:
...
self.scrollContentLayout.addStretch()
self.spacer = self.scrollContentLayout.itemAt(
self.scrollContentLayout.count() - 1)
# then...
self.scrollContentLayout.insertWidget(
self.scrollContentLayout.indexOf(self.spacer), anotherWidget)
请注意,由于显而易见的原因,索引必须始终动态获取(您不能“存储”它,因为可以同时添加/插入其他项目)。
最后,一个简单的可能性是设置布局对齐,没有任何拉伸/间隔项:
self.scrollContentLayout.setAlignment(Qt.Alignment.AlignTop)
虽然这适用于基本小部件,但如果添加混合拉伸因子和尺寸策略的项目,可能会产生不同的结果,因此请谨慎使用并注意这些方面。
我强烈建议您对尺寸提示、尺寸策略和一般布局管理进行一些适当的研究,但也考虑使用 Qt Designer 和不同的小部件类型进行进一步的测试。