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

12

我希望创建一个小部件,其中包含一个子小部件,我可以动态更改。这是我尝试的内容:

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"标签。它仍然呈现在"bar"之上。问题的截图。我该如何删除旧小部件,以便只显示新小部件?
我知道我可以更改标签的文本属性。但这不是我在应用程序中想要的,我需要更改实际的小部件(到不同的小部件类型)。
1个回答

22

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
在调试器中稍微查看了一下,似乎垃圾回收机制足够智能,可以删除布局中的引用。因此,我认为这不会导致问题。 - Stephen Terry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接