PyQt 如何从布局中删除布局

yuw*_*wei 5 python qt pyqt pyqt4 pyqt5

datainputHbox = QHBoxLayout()
layout = QVBoxLayout(self)
layout.addLayout(datainputHbox)


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

def boxdelete(self, box):
Run Code Online (Sandbox Code Playgroud)

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

The*_*ser 8

作为一个通用答案:从这里获取,稍作但重要的更改:您不应该调用 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())
Run Code Online (Sandbox Code Playgroud)

Brendan Abel 的回答中的 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
Run Code Online (Sandbox Code Playgroud)


Bre*_*bel 2

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

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
Run Code Online (Sandbox Code Playgroud)