我有一个QScrollArea小部件,它从空开始;

它有一个垂直布局,有一个QGridLayout,和一个垂直间隔,使它保持在顶部,并防止它延伸到整个滚动区域;

在程序的其他地方,有一个QTextEdit,当它改变时,它的内容会被扫描“物种”元素,然后它们被添加到QGridLayout中。任何已被移除的物种元素也将被移除。这个比特可以工作;

我一直在打开垂直滚动条,所以当它出现时,它不会位于其他东西的顶部。请注意,滚动条已经比滚动框大了,尽管不需要。
这就是问题所在。滚动区域似乎是预设的,我无法更改它。如果我向QGridLayout中添加更多行,滚动区域的大小不会增加。
取而代之的是,它保持不变的大小,并挤压QGridLayout,使它看起来丑陋(一开始);

然后在添加更多之后,它变得不可用;

请再次注意,滚动条的大小仍然与前面的图像相同。前两张图片来自Qt Designer,后3张图片来自程序运行。
如果我调整窗口大小以使QScrollArea增大,则会看到以下内容:

表示滚动区域内的某些布局未正确调整大小。
我的问题是:当我在QGridLayout中添加和删除时,我需要做什么才能使小部件的可滚动区域动态调整大小?
发布于 2021-09-04 18:44:06
关于Artfunkel's answer的更新
下面是一个PySide6演示,它使用"Populate“按钮来运行for循环,将项目添加到滚动区域。单击每个按钮时,也会将其自身删除。
from PySide6.QtWidgets import *
app = QApplication([])
scroll = QScrollArea()
scroll.setWidgetResizable(True) # CRITICAL
inner = QFrame(scroll)
inner.setLayout(QVBoxLayout())
scroll.setWidget(inner) # CRITICAL
def on_remove_widget(button):
button.deleteLater()
def populate():
for i in range(40):
b = QPushButton(inner)
b.setText(str(i))
b.clicked.connect(b.deleteLater)
inner.layout().addWidget(b)
b = QPushButton(inner)
b.setText("Populate")
b.clicked.connect(populate)
inner.layout().addWidget(b)
scroll.show()
app.exec()https://stackoverflow.com/questions/12781407
复制相似问题