如何将不断变化的小部件列表附加到 PyQT6 中 QVBoxLayout 的顶部?

问题描述 投票:0回答:1

我有QWidgetQVBoxLayoutQScrollArea内,如下所示:

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...

我明白了:

但我想要另外四个按钮也粘在顶部。有没有正确的方法来做到这一点?

python pyqt
1个回答
0
投票

标准 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 和不同的小部件类型进行进一步的测试。

© www.soinside.com 2019 - 2024. All rights reserved.