2013-01-10 174 views
3

我有一個接口,在屏幕頂部有4個按鈕,下面有我的QFrame。我想根據按下哪個按鈕來更改QFrame中的佈局。例如,如果Button_1被按下,顯示一個TextEdit Widget,如果Button_2被按下,則顯示一個ListViewWidget。Pyside更改佈局

有沒有人有任何想法如何做到這一點? 非常感謝!

回答

2

喜歡的東西...

myframe.layout().removeWidget(mywidget) 
mywidget = QTextEdit() 
myframe.layout().addWidget(myWidget) 
6

使用QStackedLayout來存儲您的小部件。然後,您可以更改爲setCurrentIndex。或者,您可以使用QStackedWidget代替您的QFrame

一個簡單的例子:

import sys 
from PySide import QtGui 

class Window(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(Window, self).__init__(parent) 

     self.textEdit = QtGui.QTextEdit('Text Edit') 
     self.listWidget = QtGui.QListWidget() 
     self.listWidget.addItem('List Widget') 
     self.label = QtGui.QLabel('Label') 

     self.stackedLayout = QtGui.QStackedLayout() 
     self.stackedLayout.addWidget(self.textEdit) 
     self.stackedLayout.addWidget(self.listWidget) 
     self.stackedLayout.addWidget(self.label) 

     self.frame = QtGui.QFrame() 
     self.frame.setLayout(self.stackedLayout) 

     self.button1 = QtGui.QPushButton('Text Edit') 
     self.button1.clicked.connect(lambda: self.stackedLayout.setCurrentIndex(0)) 
     self.button2 = QtGui.QPushButton('List Widget') 
     self.button2.clicked.connect(lambda: self.stackedLayout.setCurrentIndex(1)) 
     self.button3 = QtGui.QPushButton('Label') 
     self.button3.clicked.connect(lambda: self.stackedLayout.setCurrentIndex(2)) 

     buttonLayout = QtGui.QHBoxLayout() 
     buttonLayout.addWidget(self.button1) 
     buttonLayout.addWidget(self.button2) 
     buttonLayout.addWidget(self.button3) 

     layout = QtGui.QVBoxLayout(self) 
     layout.addLayout(buttonLayout) 
     layout.addWidget(self.frame) 


if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 

    w = Window() 
    w.show() 

    sys.exit(app.exec_()) 
+0

非常感謝您! 您是否還知道如何防止每次按下按鈕時創建多個小部件? 例如,我創建了一個標籤,每次按button_1時都會創建另一個標籤。 – user1960118

+0

@ user1960118:取決於您的代碼。 – Avaris