Python 在pyside中从QWidget取消设置布局

Python 在pyside中从QWidget取消设置布局,python,layout,pyside,Python,Layout,Pyside,我在QWidget对象中设置新布局时遇到问题。当应用程序执行时,我开始设置一种布局类型,当按下按钮时,我想用新的布局来更改它。在PySide的文档中,我读到: 将此小部件的布局管理器设置为布局 如果此小部件上已安装布局管理器, PySide.QtGui.QWidget不允许您安装另一个。你必须先 删除现有布局管理器(由返回) PySide.QtGui.QWidget.layout()),然后才能调用 具有新布局的PySide.QtGui.QWidget.setLayout() 但是如何删除现有的

我在QWidget对象中设置新布局时遇到问题。当应用程序执行时,我开始设置一种布局类型,当按下按钮时,我想用新的布局来更改它。在PySide的文档中,我读到:

将此小部件的布局管理器设置为布局

如果此小部件上已安装布局管理器, PySide.QtGui.QWidget不允许您安装另一个。你必须先 删除现有布局管理器(由返回) PySide.QtGui.QWidget.layout()),然后才能调用 具有新布局的PySide.QtGui.QWidget.setLayout()


但是如何删除现有的布局管理器?我必须在QWidget对象上应用哪些方法

如果您是PySide/PyQt新手,请参阅文档中的文章,了解Qt布局系统的概述

对于您的特定示例,您将需要一种方法来递归地从布局中删除所有对象(即所有子窗口小部件、间隔项和其他布局)。以及构建和添加新布局的方法

下面是一个简单的演示:

from PySide import QtCore, QtGui

class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        layout = QtGui.QVBoxLayout(self)
        self.changeLayout(QtCore.Qt.Vertical)
        self.button = QtGui.QPushButton('Horizontal', self)
        self.button.clicked.connect(self.handleButton)
        layout.addStretch()
        layout.addWidget(self.button)

    def handleButton(self):
        if self.button.text() == 'Horizontal':
            self.changeLayout(QtCore.Qt.Horizontal)
            self.button.setText('Vertical')
        else:
            self.changeLayout(QtCore.Qt.Vertical)
            self.button.setText('Horizontal')

    def changeLayout(self, direction):
        if self.layout().count():
            layout = self.layout().takeAt(0)
            self.clearLayout(layout)
            layout.deleteLater()
        if direction == QtCore.Qt.Vertical:
            layout = QtGui.QVBoxLayout()
        else:
            layout = QtGui.QHBoxLayout()
        for index in range(3):
            layout.addWidget(QtGui.QLineEdit(self))
        self.layout().insertLayout(0, layout)

    def clearLayout(self, layout):
        if layout is not None:
            while layout.count():
                item = layout.takeAt(0)
                widget = item.widget()
                if widget is not None:
                    widget.deleteLater()
                else:
                    self.clearLayout(item.layout())

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.setGeometry(500, 300, 300, 100)
    window.show()
    sys.exit(app.exec_())

但当我在布局中应用takeAt方法时,为什么QLineEdit对象是None?我删除除此QLineEdit之外的所有内容。@user3329477。不看你的代码是不可能说的。