pyqt:如何移除一个控件?

52 投票
2 回答
103293 浏览
提问于 2025-04-16 17:03

我有一个叫做 QGroupBox 的控件,里面有一些子控件,我想把这些子控件去掉。请问我该怎么做呢?我在文档里找不到什么 removeWidgetremoveChildremoveItem 之类的东西。我只看到如何从布局中移除东西,但显然这并不能把它们从实际的控件中去掉。

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

试试这两种方法,看看哪种对你有效(在重复多次后不要造成内存泄漏)。

44

好的,这个方法可以用:在我想要移除的那个小部件上,调用 widget.setParent(None)。我觉得把小部件添加到布局里是把它放进了一个容器,但从布局里移除的时候却不是这样……挺有趣的。

撰写回答