【问题标题】:Unset layout from QWidget in pyside从 pyside 中的 QWidget 取消设置布局
【发布时间】:2014-03-20 07:02:46
【问题描述】:

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

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

如果此小部件上已经安装了布局管理器, PySide.QtGui.QWidget 不会让你安装另一个。你必须先 删除现有的布局管理器(由 PySide.QtGui.QWidget.layout() ) 之前可以调用 PySide.QtGui.QWidget.setLayout() 与新布局。

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

【问题讨论】:

    标签: python layout pyside


    【解决方案1】:

    如果您是 PySide/PyQt 的新手,请参阅文档中的 Layout Management 文章,了解 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。没有看到你的代码就不可能说出来。
    猜你喜欢
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 2013-05-16
    • 2015-12-13
    • 2012-04-11
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多