我在QWidget对象中设置新布局时遇到问题。我开始在应用程序执行时设置一种类型的布局,并且我想在使用新布局按下按钮时更改它。在PySide的文档中,我读到了这个:
将此窗口小部件的布局管理器设置为布局。
如果此窗口小部件上已安装布局管理器, PySide.QtGui.QWidget不允许你安装另一个。你必须先 删除现有的布局管理器(由 PySide.QtGui.QWidget.layout())才可以调用 具有新布局的PySide.QtGui.QWidget.setLayout()。
但是如何删除现有的布局管理器?我必须在QWidget对象上应用哪些方法?
答案 0 :(得分:3)
如果您是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_())