当更多小部件放在里面时,我如何调整QScrollArea的内容

wil*_*ill 22 qt pyside qscrollarea

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

空QScrollArea

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

Qt Designer中的QScrollArea

在程序的其他地方,有一个QTextEdit,当它被改变时,其内容扫描"种类"元素,然后它们被添加到QGridLayout.已经除去的任何物种元素也被除去.这个位有效;

带有奇怪滚动条的QScrollArea

我一直打开垂直滚动条,所以当它出现时它不会位于那里的其他东西之上.请注意,尽管不需要,滚动条已经大于滚动框.

这就是问题.滚动区域似乎是预设的,我无法更改它.如果我向QGridLayout添加更多行,则滚动区域的大小不会增加.

相反,它保持相同的大小,并挤压QGridLayout,使它看起来很丑陋(起初);

压缩QGridLayout

然后添加更多它变得无法使用;

不可用的行编辑

请注意,滚动条仍然与之前的图像大小相同.前两个图像来自Qt Designer,后续的3个来自程序运行.

如果我调整窗口大小以使QScrollArea增长,那么我看到:

笨太小的布局

指示滚动区域内的某些布局未正确调整大小.

我的问题是; 当我在QGridLayout中添加和删除时,我需要做什么才能使窗口小部件的可滚动区域动态调整大小?

UmN*_*obe 26

文件提供了一个答案:

widgetResizable:bool
此属性保存滚动区域是否应调整视图窗口小部件的大小.如果此属性设置为false(默认值),则滚动区域将遵循其窗口小部件的大小.

将其设置为true.


Art*_*kel 26

如果你是从谷歌来到这里并且没有幸运接受的答案,那是因为你错过了另一个秘密调用:QScrollArea::setWidget.您必须创建并明确标识要滚动的单个窗口小部件.仅仅作为孩子添加项目是不够的!直接添加多个项目ScrollArea也不起作用.

此脚本演示了QScrollArea的一个简单工作示例:

from PySide.QtGui import *

app = QApplication([])

scroll = QScrollArea()
scroll.setWidgetResizable(True) # CRITICAL

inner = QFrame(scroll)
inner.setLayout(QVBoxLayout())

scroll.setWidget(inner) # CRITICAL

for i in range(40):
    b = QPushButton(inner)
    b.setText(str(i))
    inner.layout().addWidget(b)

scroll.show()
app.exec_()
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案。`QScrollArea` 应该像这样实现。尽管我想指出,在创建“QFrame”或“QPushButton”时没有必要传递父窗口小部件,因为当调用“setWidget”和“addWidget”时,它们会自动重新设置父窗口部件(至少在C++中,我不知道Python中是否有不同)。 (2认同)