在PyQT中获取布局的小部件

Xio*_*iov 9 python qt pyqt pyqt4

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

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

我非常误解了什么吗?我上周刚刚开始做PyQT,并且主要是通过API文档的试错来学习.

Tro*_*our 10

那很奇怪.我的理解是通过addWidget转移所有权添加小部件到布局,所以调用children()应该工作.

但是,作为替代方案,您可以通过使用count()itemAt(int)提供QLayoutItemto来遍历布局项removeItem(QLayoutItem*).

编辑:

我刚试过addWidget一个直接的C++测试应用程序.并且它不会将QObject所有权转移到布局,所以children()确实是一个空列表.该文档清楚地说,所有权被转移,虽然...

编辑2:

好吧,看起来好像它将所有权转移到具有该布局的小部件(这不是文档所说的).这使得布局中布局兄弟姐妹中的项目本身就在QObject层次结构中!因此更容易坚持countitemAt.


Arn*_*eek 8

要从QLayout获取窗口小部件,您必须调用其itemAt(index)方法.正如此方法的名称所暗示的那样,它将返回一个项而不是一个小部件.调用widget()结果将最终为您提供小部件:

myWidget = self.myLayout.itemAt(index).widget()
Run Code Online (Sandbox Code Playgroud)

要删除窗口小部件,请将父窗口小部件设置为None:

myWidget.setParent(None)
Run Code Online (Sandbox Code Playgroud)

Qlayout count()方法也很有帮助.要查找和删除布局的所有内容:

index = myLayout.count()
while(index >= 0):
    myWidget = myLayout.itemAt(index).widget()
    myWidget.setParent(None)
    index -=1
Run Code Online (Sandbox Code Playgroud)