【问题标题】:Get a layout's widgets in PyQT在 PyQT 中获取布局的小部件
【发布时间】:2011-03-05 20:48:07
【问题描述】:

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

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

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

【问题讨论】:

    标签: python qt pyqt pyqt4


    【解决方案1】:

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

    【讨论】:

    • index = myLayout.count()-1 我同意这个答案,但 -1 应该在顶部,因为索引从 0 开始,如果你不这样做,索引会一直到循环中的 -1。
    【解决方案2】:

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

    但是,作为替代方案,您可以使用count()itemAt(int)QLayoutItem 提供给removeItem(QLayoutItem*) 来循环布局项。

    编辑:

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

    编辑 2:

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

    【讨论】:

    • 这似乎可以解决问题,谢谢。它不像我想要的那样工作,但这似乎是由于我需要解决的一些显示更新问题,这些问题完全独立于此。
    • 哦,所以itemAt 给出了一个QWidgetItem(这需要使用removeItem,无论出于何种原因,它都没有按照我的意愿进行操作)。但是,如果您在其上调用.widget(),您将获得(震惊!)与之关联的QWidget,可以使用removeWidget 将其删除并设置为具有None 的父级。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 2011-05-30
    • 2018-07-13
    • 1970-01-01
    • 2018-08-14
    • 2014-12-01
    • 2018-03-03
    相关资源
    最近更新 更多