在 PyQT 中获取布局的小部件

问题描述 投票:0回答:2

我有一个

QVBoxLayout
,我通过
addWidget()
添加了一些小部件。 我现在需要删除这些小部件,似乎我需要使用
removeWidget()
(它接受要删除的小部件)来做到这一点。

我认为在布局上调用

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

我是否误解了什么? 我上周刚刚开始使用 PyQT,主要是通过 API 文档的反复试验来学习。

python qt pyqt pyqt4
2个回答
32
投票

要从 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

19
投票

这很奇怪。我的理解是,通过

addWidget
添加小部件会将所有权转移到布局,因此调用
children()
应该可以工作。

但是,作为替代方案,您可以使用

count()
itemAt(int)
QLayoutItem
提供
removeItem(QLayoutItem*)
来循环布局项目。

编辑:

我刚刚尝试过

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

编辑2:

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

count
itemAt

编辑3:

我对文档的解释是错误的。我将布局项与小部件混淆了。以下澄清了一直以来的情况。

https://doc.qt.io/qtforpython-5/overviews/layout.html

布局中的小部件是布局所在小部件的子级 安装,而不是布局本身。 Widget 只能有其他 小部件作为父级,而不是布局。

© www.soinside.com 2019 - 2024. All rights reserved.