如何防止 QHBoxLayout 减小其中元素的大小?

How to prevent QHBoxLayout from reducing the size of elements in it?

我有一个 QScrollArea 和一个 QHBoxLayout,当我在布局中添加很多小部件时,它们会被压缩成一个小尺寸,而不是像我预期的那样添加滚动条,下图显示:

这是我使用的代码:

from PyQt5.QtWidgets import QGroupBox, QHBoxLayout, QLabel, QVBoxLayout, QScrollArea


class LayerParamsBox(QGroupBox):
    def __init__(self):
        super().__init__()

        self.setTitle("Layer Parameters")
        self.setLayout(QHBoxLayout())
        self.scroll_area = QScrollArea()
        self.scroll_area.verticalScrollBar().setEnabled(False)
        self.scroll_area.setLayout(QHBoxLayout())
        self.layout().addWidget(self.scroll_area)

        test = Test("test test")

        for i in range(30):
            self.add_layer(test, i)

    def add_layer(self, layer, n):
        inner_box = QGroupBox()
        self.scroll_area.layout().addWidget(inner_box)
        inner_box.setLayout(QVBoxLayout())
        inner_box.setTitle(f"Layer {n}")

        label = QLabel(layer.type_name)
        inner_box.layout().addWidget(label)


class Test:
    def __init__(self, name):
        self.type_name = name

我想要做的是,我希望内框不调整大小,而是尽可能大以显示其中的标签,如果我添加的内框多于 window 可以容纳的数量然后应该会出现一个水平滚动条,我该如何实现?

QScrollArea 不是您要滚动的小部件的容器,而只是实际正在滚动的实际小部件(容器)的“查看器”。

您不应该为滚动区域设置布局,而是创建一个小部件,为那个小部件设置布局,然后使用setWidget()

您还需要使用 setWidgetResizable 来确保正确调整容器小部件的大小,为所有托管小部件留出足够的 space 并最终在需要时显示滚动条。

我建议您仔细阅读 QScrollArea documentation 以更好地理解其工作原理。

class LayerParamsBox(QGroupBox):
    def __init__(self):
        # ...
        contents = QWidget()
        self.scroll_area_layout = QHBoxLayout(contents)
        self.scroll_area.setWidget(contents)
        self.scroll_area.setWidgetResizable(True)
        # ...

    def add_layer(self, layer, n):
        inner_box = QGroupBox()
        self.scroll_area_layout.addWidget(inner_box)
        # ...