PyQt:在运行时向scrollarea添加小部件
我试图通过按下按钮在运行时添加新的小部件(在下面的示例中,我使用标签)。下面是一个例子:PyQt:在运行时向scrollarea添加小部件,qt,pyqt,resize,qlabel,qscrollarea,Qt,Pyqt,Resize,Qlabel,Qscrollarea,我试图通过按下按钮在运行时添加新的小部件(在下面的示例中,我使用标签)。下面是一个例子: 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
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_()
当我启动应用程序时,一切看起来都正常,标签列表显示正确,标签大小也正确。但是,当我多次按下按钮添加新标签时,新标签会添加到列表中,但其大小会发生变化。列表中的所有标签都变小了
如何修复此错误?问题在于行:
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)
问题在于线路:
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)