【问题标题】:How to dynamically change child widgets with Python and Qt?如何使用 Python 和 Qt 动态更改子小部件?
【发布时间】:2011-09-18 15:07: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”标签。它仍然呈现在“栏”之上。 Screenshot of the problem。如何删除旧的小部件以便只显示新的小部件?

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

【问题讨论】:

    标签: python qt pyqt pyqt4 pyside


    【解决方案1】:

    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)
    

    【讨论】:

    • 非常感谢!那行得通:) 我需要从布局中删除小部件吗?不删除它似乎有效,但这可能有问题?
    • 在调试器中摸索了一下,看起来垃圾收集足够聪明,可以删除布局中的引用。所以我认为这不会造成问题。
    猜你喜欢
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 2019-10-10
    • 2018-11-19
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 2019-09-14
    相关资源
    最近更新 更多