PyQt:在运行时向滚动区添加小部件

5

我正在尝试通过按下按钮在运行时添加新的小部件(在下面的示例中,我使用标签)。这里是例子:

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class Widget(QWidget):

    def __init__(self, parent= None):
        super(Widget, self).__init__()

        btn_new = QPushButton("Append new label")
        self.connect(btn_new, SIGNAL('clicked()'), self.add_new_label)

        #Container Widget       
        self.widget = QWidget()
        #Layout of Container Widget
        layout = QVBoxLayout(self)
        for _ in range(20):
            label = QLabel("test")
            layout.addWidget(label)
        self.widget.setLayout(layout)

        #Scroll Area Properties
        scroll = QScrollArea()
        scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
        scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        scroll.setWidgetResizable(False)
        scroll.setWidget(self.widget)

        #Scroll Area Layer add
        vLayout = QVBoxLayout(self)
        vLayout.addWidget(btn_new)
        vLayout.addWidget(scroll)
        self.setLayout(vLayout)

    def add_new_label(self):
        label = QLabel("new")
        self.widget.layout().addWidget(label)


if __name__ == '__main__':
    app = QApplication(sys.argv)

    dialog = Widget()
    dialog.show()

    app.exec_()

当我启动应用程序时,一切都看起来很正常,标签列表正确显示并且它们的大小也正确。但是,当我按多次添加新标签的按钮时,新标签被添加到列表中,但它们的大小会改变。列表中的所有标签变小了。
我该如何修复此错误?
1个回答

8
问题出在这一行代码:
    scroll.setWidgetResizable(False)

这显然会使得widget在添加更多子widget后停止自适应调整大小(导致它们都挤在同一空间中)。

所以将其重置为True,并在widget的布局底部添加一个可伸缩的空间:

    layout.addStretch()
    self.widget.setLayout(layout)
    ...
    scroll.setWidgetResizable(True)
    scroll.setWidget(self.widget)

然后在空白区域之前插入新标签。
    def add_new_label(self):
        label = QLabel("new")
        layout = self.widget.layout()
        layout.insertWidget(layout.count() - 1, label)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接