2014-02-19 16 views
4

我在QWidget對象中設置新佈局時遇到問題。當應用程序執行時,我開始設置一種類型的佈局,並且我想在按下新佈局按鈕時更改它。在PySide的文檔中,我讀到:從QWidget在pyside中取消設置佈局

設置此小部件的佈局管理器進行佈局。

如果已經有一個佈局管理器安裝在這個小部件上, PySide.QtGui.QWidget不會讓你安裝另一個。您必須先使用 刪除現有佈局管理器(由 PySide.QtGui.QWidget.layout()返回),然後才能使用新佈局調用 PySide.QtGui.QWidget.setLayout()。

但我該如何刪除現有的佈局管理器?我必須在我的QWidget對象上應用哪些方法?

回答

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_()) 
+0

但爲什麼QLineEdit的對象都沒有,當我在我的佈局應用takeAt方法?我刪除除了這個QLineEdit之外的所有東西。 – user3329477

+0

@ user3329477。沒有看到你的代碼是不可能的。 – ekhumoro

+1

'clearLayout'示例非常有幫助! –