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

ありがとうございます! That works :)レイアウトからウィジェットを削除する必要がありますか?それを削除しても機能していないようですが、これに問題がありますか? – Jules

+6

デバッガでちょっと覗いてみると、ガベージコレクションがレイアウト内の参照を削除するほどスマートになっているようです。だから私はそれが問題を引き起こすとは思わない。 –

関連する問題