2011-06-20 62 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

在調試器中徘徊一段時間,看起來垃圾收集足夠智能,可以移除佈局中的引用。所以我不認爲這會造成問題。 –

相關問題