2012-08-06 188 views
8

我试图显示两种布局之一,具体取决于是否选中复选框。pyside显示/隐藏布局

用widgets我可以做哪些工作正常,以下内容仅: (在这个例子中,每个小部件是QLineEdit的)

myCheckbox.stateChanged.connect(switchControls) 

def switchControls (self, state): 
    if state == 2: 
     self.widget1.show() 
     self.widget2.hide() 
    else: 
     self.widget1.hide() 
     self.widget2.show() 

然而,因为我想一个描述性标签添加到每个QLineEdit的,我需要在某种布局或容器中组合QLineEdit + QLabel。 我一直在尝试使用addlayout/removeLayout/removeItem在布局而不是小部件上进行上述操作,但无法使其工作。该程序在我最后一次尝试中崩溃。

在两种布局之间切换的最简单方法是什么?它不必使用复选框,但我更喜欢。

回答

9

将布局放入单独的小部件。现在你只“使用小部件”。

下面是一个例子:

from PySide.QtCore import * 
from PySide.QtGui import * 

class MainWindow(QWidget): 
    def __init__(self): 
     QWidget.__init__(self) 

     self.layout=QVBoxLayout() 
     self.setLayout(self.layout) 


     self.checkbox=QCheckBox("Layouts") 
     self.layout.addWidget(self.checkbox) 


     self.widget1=QWidget() 
     self.layout.addWidget(self.widget1) 

     self.layout1=QVBoxLayout() 
     self.widget1.setLayout(self.layout1) 

     self.layout1.addWidget(QLabel("First layout")) 

     self.layout1.addWidget(QTextEdit()) 


     self.widget2=QWidget() 
     self.layout.addWidget(self.widget2) 

     self.layout2=QHBoxLayout() 
     self.widget2.setLayout(self.layout2) 

     self.layout2.addWidget(QTextEdit("Second layout")) 

     self.layout2.addWidget(QTextEdit()) 


     self.checkbox.toggled.connect(self.checkbox_toggled) 
     self.checkbox.toggle() 

     self.show() 

    def checkbox_toggled(self, state): 
     self.widget1.setVisible(state) 
     self.widget2.setVisible(not state) 

app=QApplication([]) 
mw=MainWindow() 
app.exec_() 

运行它,看看它是如何工作的。

+0

我应该写“只使用小部件”。我可以在里面布置什么样的小部件?我认为小部件进入布局,而不是其他方式。 – user985366 2012-08-06 11:48:11

+1

您可以将布局放入大部分小部件中。通常使用'QWidget'和'QFrame'。我会举一个例子。 – 2012-08-06 11:51:43