在PyQT中获取布局的小部件

时间:2010-06-19 20:54:37

标签: python qt pyqt pyqt4

我有QVBoxLayout我已经通过addWidget()添加了一些小部件。我现在需要删除那些小部件,似乎我需要使用removeWidget()(它将删除一个小部件)来做到这一点。

我认为在我的布局上调用children()findChildren(QWidget)会返回我添加到其中的小部件列表;不过,我在调试器中,我只是收到空列表。

我非常误解了什么吗?我上周刚刚开始做PyQT,并且大部分时间都是通过API文档的试错来学习。

2 个答案:

答案 0 :(得分:10)

这很奇怪。我的理解是,通过addWidget添加小部件会将所有权转移到布局,因此调用children()应该可以正常工作。

但是,作为替代方案,您可以使用count()itemAt(int)来覆盖布局项,以便向QLayoutItem提供removeItem(QLayoutItem*)

修改

我刚试过addWidget一个直接的C ++测试应用程序。并且它不会将QObject所有权转移到布局,因此children()确实是一个空列表。 docs明确表示所有权已经转移......

编辑2:

好吧,它似乎将所有权转移到具有该布局的小部件(文档所说的内容)。这使布局的布局兄弟中的项目本身在QObject层次结构中!因此,更容易坚持countitemAt

答案 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