2011-05-05 106 views
22

我有一个QGroupBox小部件,里面有我想要删除的子项。我怎么做?我找不到任何removeWidget,removeChild,removeItem,或任何类似的the docs。我只能看到如何从布局中删除东西,但显然,它并没有从实际的部件中删除它。pyqt:如何删除一个小部件?

+0

您是否希望_just_从QGroupBox中移除该小部件,或者您是否想要完全删除该小部件? – 2011-05-06 15:46:48

+0

@Alex:完全删除 – Claudiu 2011-05-06 16:03:29

回答

17

那么,这个工程:对我想删除的小部件,调用widget.setParent(None)。我喜欢在布局中添加小部件的方式,但从布局中移除不会......有趣的东西。

+0

你必须明白一个小部件是否被创建,无论你是否把它放在一个布局中,并且它有一个父项。布局只是负责组织它在屏幕上,它不是一个可靠或甚至可用的方法来显示和隐藏小部件 – 2011-05-05 15:07:41

+0

我看不到添加或删除小部件(任何添加/删除小部件功能)的方式,除了布局。将小部件添加到布局似乎会使其显示(它实际上将小部件的父级设置为布局所用的容器)。我希望从相同的布局中删除相同的小部件将使其不会显示(即将其重新放回与我之前添加到布局中相同的状态)。但做到这一点的唯一方法似乎是将窗口部件的父项设置为None ...,这根本不是对称的。 – Claudiu 2011-05-05 15:13:01

+0

好吧,你可以使用父母的'removeChild'方法,但最好'隐藏' – 2011-05-05 15:18:32

5

您确定要实际上删除小部件? hide不会吗?恕我直言,接受的方法是使用show/hide使部件出现并从用户的视图中消失。

的方法是使用QStackedWidget

+0

yea; [见这里](http://stackoverflow.com/questions/5889705/pyqt-how-to-remove-elements-from-a-qvboxlayout/5890555#5890555)。虽然我猜隐藏也可以工作 – Claudiu 2011-05-05 15:01:42

+0

@Claidiu:如果这就是你想要的,我认为答案给你的解决方案 – 2011-05-05 15:04:13

+0

@Eli:答案并没有告诉我如何从父母实际移除部件,这是我在这里问。 – Claudiu 2011-05-05 15:06:55

32

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

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.widget()方法,这种情况下,您不需要将变量名称分配给None,因为它不是在您的功能之外引用。

试试这两种方法,看看你的作品(重复一堆好多次后不要泄漏记忆)。