我有QVBoxLayout
我已经通过addWidget()
添加了一些小部件。我现在需要删除那些小部件,似乎我需要使用removeWidget()
(它将删除一个小部件)来做到这一点。
我认为在我的布局上调用children()
或findChildren(QWidget)
会返回我添加到其中的小部件列表;不过,我在调试器中,我只是收到空列表。
我非常误解了什么吗?我上周刚刚开始做PyQT,并且大部分时间都是通过API文档的试错来学习。
答案 0 :(得分:10)
这很奇怪。我的理解是,通过addWidget
添加小部件会将所有权转移到布局,因此调用children()
应该可以正常工作。
但是,作为替代方案,您可以使用count()
和itemAt(int)
来覆盖布局项,以便向QLayoutItem
提供removeItem(QLayoutItem*)
。
修改强>
我刚试过addWidget
一个直接的C ++测试应用程序。并且它不会将QObject
所有权转移到布局,因此children()
确实是一个空列表。 docs明确表示所有权已经转移......
编辑2:
好吧,它似乎将所有权转移到具有该布局的小部件(不文档所说的内容)。这使布局的布局兄弟中的项目本身在QObject
层次结构中!因此,更容易坚持count
和itemAt
。
答案 1 :(得分:5)
要从QLayout获取小部件,您必须调用其itemAt(index)
方法。
正如此方法的名称所暗示的那样,它将返回一个项而不是一个小部件。在结果上调用widget()
将最终为您提供小部件:
myWidget = self.myLayout.itemAt(index).widget()
要删除窗口小部件,请将父窗口小部件设置为None
:
myWidget.setParent(None)
同样非常有帮助的是QLayout count()
方法。要查找和删除布局的所有内容:
index = myLayout.count()
while(index >= 0):
myWidget = myLayout.itemAt(index).widget()
myWidget.setParent(None)
index -=1