Как динамически менять дочерние виджеты с помощью Python и Qt? - PullRequest
10 голосов
/ 20 июня 2011

Я хотел бы создать виджет с дочерним виджетом, который я могу динамически изменять.Вот что я попробовал:

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" визуально.Это все еще оказано сверху "бара". Скриншот проблемы .Как удалить старый виджет, чтобы отображался только новый виджет?

Я знаю, что могу изменить свойство текста метки.Это не то, что мне нужно в моем приложении, мне нужно изменить фактический виджет (на другой тип виджета).

1 Ответ

19 голосов
/ 20 июня 2011

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)
...