2014-03-07 40 views
1

我試圖在運行時通過按下一個按鈕來添加新的小部件(在下面的示例中使用標籤)。這裏的例子:PyQt:在運行期間將小部件添加到Scrollarea

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

當我啓動應用程序一切看起來不錯,標籤列表正確顯示,其大小也是正確的。但是,當我在按鈕上按幾次以添加新標籤時,新的標籤將被添加到列表中,但其尺寸會發生變化。名單上的所有標籤都變小了。

如何解決這個問題?

回答

4

的問題是該行:

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)