【问题标题】:PyQt How to remove a layout from a layoutPyQt 如何从布局中删除布局
【发布时间】:2016-09-30 14:08:41
【问题描述】:
datainputHbox = QHBoxLayout()
layout = QVBoxLayout(self)
layout.addLayout(datainputHbox)


pagedatainputdeletboxbutton1.clicked.connect(lambda:self.boxdelete(datainputHbox))

def boxdelete(self, box):

这是 PyQt 程序 如何编写 boxdelete 函数以删除 datainputHbox 表单布局。我尝试了很多。但是我只能删除所有小部件,但不能删除布局。

【问题讨论】:

  • 嗯。我真的以为有一个removeLayout 函数...

标签: python qt pyqt pyqt4 pyqt5


【解决方案1】:

作为一个通用答案:taken from here 有轻微但重要的变化:您不应该调用 widget.deleteLater()。至少在我的情况下,这导致 python 崩溃

全局函数

def deleteItemsOfLayout(layout):
     if layout is not None:
         while layout.count():
             item = layout.takeAt(0)
             widget = item.widget()
             if widget is not None:
                 widget.setParent(None)
             else:
                 deleteItemsOfLayout(item.layout())

连同Brendan Abel's答案中的boxdelete功能

def boxdelete(self, box):
    for i in range(self.vlayout.count()):
        layout_item = self.vlayout.itemAt(i)
        if layout_item.layout() == box:
            deleteItemsOfLayout(layout_item.layout())
            self.vlayout.removeItem(layout_item)
            break

【讨论】:

    【解决方案2】:

    您可以通过获取相应的QLayoutItem 并删除它来删除QLayouts。您还应该存储对布局的引用,否则以后没有其他方法可以访问它们,除非您知道它们所属的小部件。

    datainputHbox = QHBoxLayout()
    self.vlayout = QVBoxLayout(self)
    layout.addLayout(datainputHbox)
    pagedatainputdeletboxbutton1.clicked.connect(lambda: self.boxdelete(datainputHbox))
    
    def boxdelete(self, box):
        for i in range(self.vlayout.count()):
            layout_item = self.vlayout.itemAt(i)
            if layout_item.layout() == box:
                self.vlayout.removeItem(layout_item)
                return
    

    【讨论】:

    • removeItem 不会完全删除对象,由于其引用计数器/垃圾收集器,这可能会导致它保留在 Python 中。来自 [pyqt5 文档][doc.qt.io/qt-5/qlayout.html#removeItem],“从布局中删除布局项目。删除项目是调用者的责任。”
    【解决方案3】:

    实现TheTrowser's答案的单个函数,可以说更干净:

    def clear_item(self, item):
        if hasattr(item, "layout"):
            if callable(item.layout):
                layout = item.layout()
        else:
            layout = None
    
        if hasattr(item, "widget"):
            if callable(item.widget):
                widget = item.widget()
        else:
            widget = None
    
        if widget:
            widget.setParent(None)
        elif layout:
            for i in reversed(range(layout.count())):
                self.clear_item(layout.itemAt(i))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-06
      • 1970-01-01
      • 1970-01-01
      • 2014-02-07
      • 1970-01-01
      • 2021-02-10
      • 1970-01-01
      相关资源
      最近更新 更多