2011-06-20 41 views
9

我想创建一个具有可以动态更改的子小部件的小部件。这是我尝试过的:如何用Python和Qt动态更改子窗口小部件?

import sys 
from PySide.QtCore import * 
from PySide.QtGui import * 

class Widget(QWidget): 
    def __init__(self, parent=None): 
     QWidget.__init__(self, parent) 
     self.setLayout(QVBoxLayout()) 
     self.child = QLabel("foo", self) 
     self.layout().addWidget(self.child) 
    def update(self): 
     self.layout().removeWidget(self.child) 
     self.child = QLabel("bar", self) 
     self.layout().addWidget(self.child) 

app = QApplication(sys.argv) 
widget = Widget() 
widget.show() 
widget.update() 
app.exec_() 

问题是这实际上并没有从视觉上删除“foo”标签。它仍然呈现在“酒吧”之上。 Screenshot of the problem。如何删除旧窗口小部件,以便仅显示新窗口小部件?

我知道我可以更改标签的文本属性。这不是我想要的应用程序中,我需要更改实际的小部件(到不同的小部件类型)。

回答

18

removeWidget()只从版面中删除项目,它不会删除它。您可以致电setParent(None)删除子部件。

def update(self): 
    self.layout().removeWidget(self.child) 
    self.child.setParent(None) 
    self.child = QLabel("bar", self) 
    self.layout().addWidget(self.child) 
+1

非常感谢!这工作:)我是否需要从布局中删除小部件?不删除它似乎工作,但也许这有问题? – Jules

+6

在调试器中徘徊一段时间,看起来垃圾收集足够智能,可以移除布局中的引用。所以我不认为这会造成问题。 –

相关问题