【问题标题】:PyQt: Adding widgets to scrollarea during the runtimePyQt:在运行时将小部件添加到滚动区域
【发布时间】:2014-03-07 16:53:55
【问题描述】:

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

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_()

当我启动应用程序时,一切看起来都正常,标签列表正确显示并且它们的大小也正确。但是,当我按几次按钮添加新标签时,新标签会添加到列表中,但它们的大小会发生变化。列表的所有标签都变小了。

如何解决这个错误?

【问题讨论】:

    标签: qt pyqt resize qlabel qscrollarea


    【解决方案1】:

    问题出在这条线:

        scroll.setWidgetResizable(False)
    

    当您向其中添加更多子小部件时,这显然会停止小部件调整大小(因此它们都会在同一个空间中被挤压在一起)。

    因此将其重置为True 并在小部件布局的底部添加一个可拉伸空间:

        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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      • 2014-08-16
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-05
      相关资源
      最近更新 更多