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

12 投票
1 回答
11444 浏览
提问于 2025-04-16 19:54

我想创建一个小部件,这个小部件里面有一个可以动态更改的子小部件。以下是我尝试的代码:

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)

撰写回答