PyQt:如何删除一个小部件?

51

我有一个包含子级的 QGroupBox 组件,我想要移除其中的子级,应该怎么做? 我在文档中找不到任何 removeWidgetremoveChild 或类似的东西。 我只能看到如何从布局中删除控件,但是那显然并没有从实际的组件中删除它。


你是想仅仅从QGroupBox中移除控件,还是想彻底删除控件? - user736399
2个回答

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

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

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.widget()方法从此函数返回的QLayoutItem获取小部件指针,在这种情况下,你不需要将变量名赋值为None,因为它在函数外部没有被引用。

尝试这两种方法并查看哪种方法适合你(不要重复执行很多次以避免内存泄漏)。


44

好的,这样做就可以:在要移除的小部件上调用widget.setParent(None)。我喜欢将小部件添加到布局中会自动添加到容器中,但是从布局中删除不会... 真有趣。


你必须明白,无论你是否将一个小部件放入布局中并且它都有一个父级。布局只负责在屏幕上组织它,它不是一种可靠甚至可用的方法来显示和隐藏小部件。 - Eli Bendersky
我没有看到除了布局之外添加或删除小部件的方法(任何添加/删除小部件的功能)。将小部件添加到布局中似乎会使其显示出来(实际上是将小部件的父级设置为容器所在的布局)。我希望从相同的布局中删除同一小部件会使其不再显示(即将其放回添加到布局之前的状态)。但唯一的方法似乎是将小部件的父级设置为“无”...这根本不对称。 - Claudiu
好的,你可以使用父元素的 removeChild 方法,但最好是使用 hide - Eli Bendersky
@Eli: 啊,现在我们进入正题了!问题是我在文档中没有找到removeChild方法,当我试图在我的qdialog上调用它时,Python显示它不存在...你能告诉我它在哪里吗? - Claudiu
抱歉,我现在找不到它了 - 也许这是一些旧的东西,在谷歌搜索中留下了痕迹,但已经不存在了。就我个人而言,我从未使用过它。 - Eli Bendersky
显示剩余2条评论

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