【问题标题】:pyqt: how to remove a widget?pyqt:如何删除小部件?
【发布时间】:2011-08-19 11:32:00
【问题描述】:

我有一个 QGroupBox 小部件,其中包含要删除的子部件。我怎么做?我在the docs 中找不到任何removeWidget、removeChild、removeItem 或类似内容。我只能看到如何从布局中删除东西,但显然并没有从实际的小部件中删除它。

【问题讨论】:

  • 您是要只是从 QGroupBox 中删除小部件,还是要完全删除小部件?

标签: python qt widget pyqt


【解决方案1】:

如果您的小部件没有依赖它的子小部件,我认为您可以使用:

layout.removeWidget(self.widget_name)
self.widget_name.deleteLater()
self.widget_name = None

在我的测试中,当它是一个有孩子的小部件时,你必须:

import sip
layout.removeWidget(self.widget_name)
sip.delete(self.widget_name)
self.widget_name = None

如果您在类或全局级别没有小部件的变量名称,您仍然可以使用 layout.takeAt(index) 从布局中删除并从 QLayoutItem 获取小部件指针,此函数使用 QLayoutItem.widget() 返回方法,在这种情况下,您不需要将变量名称分配给 None,因为它没有在您的函数之外被引用。

尝试这两种方法,看看哪种方法适合你(重复多次后不要泄漏内存)。

【讨论】:

    【解决方案2】:

    好吧,这行得通:在我要删除的小部件上,调用widget.setParent(None)。我喜欢添加到布局中如何将小部件添加到容器中,但从布局中删除并不...有趣的东西。

    【讨论】:

    • 您必须了解,无论您是否将其放入布局中,都会创建一个小部件,并且它有一个父级。布局只负责在屏幕上组织它,它不是显示和隐藏小部件的可靠甚至可用的方法
    • 除了布局之外,我没有看到添加或删除小部件(任何添加/删除小部件功能)的方法。将小部件添加到布局似乎可以显示它(它实际上所做的是将小部件的父级设置为布局所针对的容器)。我希望从同一布局中删除相同的小部件会使其不显示(即,将其恢复为与我将其添加到布局之前相同的状态)。但这样做的唯一方法似乎是将小部件的父级设置为 None... 这根本不是对称的。
    • 嗯,你可以使用父级的removeChild方法,但最好是hide
    • @Eli:啊,现在我们开始说话了!问题是我在the docs 中没有看到removeChild 方法,当我尝试在我的qdialog 上调用它时python 说它不存在...你能指出它在哪里吗?
    • 抱歉,我现在找不到 - 也许是旧的东西在谷歌搜索中留下了痕迹但不再存在。我个人从未使用过它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 2011-07-12
    • 2012-01-28
    • 2017-03-28
    相关资源
    最近更新 更多