如何使用Python和Qt动态更改子窗口小部件?

Jul*_*les 10 python qt pyqt pyqt4 pyside

我想创建一个具有子窗口小部件的窗口小部件,我可以动态更改它.这是我尝试过的:

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_()
Run Code Online (Sandbox Code Playgroud)

问题是,这实际上并没有在视觉上删除"foo"标签.它仍然呈现在"酒吧"之上.问题的屏幕截图.如何删除旧窗口小部件以便仅显示新窗口小部件?

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

Ste*_*rry 20

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)
Run Code Online (Sandbox Code Playgroud)

  • 在调试器中调试一下,看起来垃圾收集足够智能,可以删除布局中的引用.所以我不认为这会导致问题. (6认同)