如何防止 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)
# ...
我有一个 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)
# ...