2016-04-09 14 views
1

Ich habe ein Beispiel für QStacked Widget Code aus dem Internet generiert wich eigenes Layout für jedes Kind (unten)Einrichten statechanged Signal in QStackedWidget, pyqt

import sys 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

class stackedExample(QWidget): 
    def __init__(self): 
     super(stackedExample, self).__init__() 
     self.leftlist = QListWidget() 
     self.leftlist.insertItem(0, 'Contact') 
     self.leftlist.insertItem(1, 'Personal') 
     self.leftlist.insertItem(2, 'Educational') 

     self.stack1 = QWidget() 
     self.stack2 = QWidget() 
     self.stack3 = QWidget() 

     self.stack1UI() 
     self.stack2UI() 
     self.stack3UI() 

     self.Stack = QStackedWidget(self) 
     self.Stack.addWidget(self.stack1) 
     self.Stack.addWidget(self.stack2) 
     self.Stack.addWidget(self.stack3) 

     hbox = QHBoxLayout(self) 
     hbox.addWidget(self.leftlist) 
     hbox.addWidget(self.Stack) 

     self.setLayout(hbox) 
     self.leftlist.currentRowChanged.connect(self.display) 
     self.setGeometry(300, 50, 10, 10) 
     self.setWindowTitle('StackedWidget demo') 
     self.show() 

    def stack1UI(self): 
     layout = QFormLayout() 
     layout.addRow("Name", QLineEdit()) 
     layout.addRow("Address", QLineEdit()) 
     # self.setTabText(0,"Contact Details") 
     self.stack1.setLayout(layout) 

    def stack2UI(self): 
     layout = QFormLayout() 
     sex = QHBoxLayout() 
     sex.addWidget(QRadioButton("Male")) 
     sex.addWidget(QRadioButton("Female")) 
     layout.addRow(QLabel("Sex"), sex) 
     layout.addRow("Date of Birth", QLineEdit()) 

     self.stack2.setLayout(layout) 

    def stack3UI(self): 
     layout = QHBoxLayout() 
     layout.addWidget(QLabel("subjects")) 
     layout.addWidget(QCheckBox("Physics")) 
     layout.addWidget(QCheckBox("Maths")) 
     self.stack3.setLayout(layout) 

    def state_changed(self): 
     pass 

    def display(self, i): 
     self.Stack.setCurrentIndex(i) 


def main(): 
    app = QApplication(sys.argv) 
    ex = stackedExample() 
    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main() 

Jetzt möchte ich Daten aus allen von ihnen sammeln und verarbeite es später. Wie kann ich zum Beispiel wissen, welche Checkbox aktiviert wurde? Dieser Code

layout.addWidget(QCheckBox("Physics").stateChanged.connect(self.state_changed)) 

gibt mir

Process finished with exit code -1073741819 (0xC0000005) 

Antwort

0

Wenn Sie

layout.addWidget(QCheckBox("Physics").stateChanged.connect(self.state_changed)) 

schreiben, die nicht die Physik Checkbox nicht Nachschlag aber es schafft eine neue Checkbox. Da Sie keinen Python-Verweis darauf beibehalten, wird dieser nach dem Verlassen des Konstruktors gelöscht. Es ist jedoch immer noch mit einem Signal verbunden, was zu unvorhersehbarem Verhalten führt.

Wenn Sie eine Verbindung zum ursprünglichen Kontrollkästchen herstellen möchten, müssen Sie einen Verweis darauf erstellen. So ähnlich:

import sys 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

class stackedExample(QWidget): 
    def __init__(self): 
     super(stackedExample, self).__init__() 
     self.leftlist = QListWidget() 
     self.leftlist.insertItem(0, 'Contact') 
     self.leftlist.insertItem(1, 'Personal') 
     self.leftlist.insertItem(2, 'Educational') 

     self.stack1 = QWidget() 
     self.stack2 = QWidget() 
     self.stack3 = QWidget() 

     self.stack1UI() 
     self.stack2UI() 
     self.stack3UI() 

     # Renamed self.stack to self.stack since the convention is to start 
     # class names with a capital but regular variables with a lower case. 
     self.stack = QStackedWidget(self) 
     self.stack.addWidget(self.stack1) 
     self.stack.addWidget(self.stack2) 
     self.stack.addWidget(self.stack3) 

     hbox = QHBoxLayout(self) 
     hbox.addWidget(self.leftlist) 
     hbox.addWidget(self.stack) 

     self.setLayout(hbox) 
     self.leftlist.currentRowChanged.connect(self.display) 
     self.setGeometry(300, 50, 10, 10) 
     self.setWindowTitle('StackedWidget demo') 
     self.show() 

    def stack1UI(self): 
     layout = QFormLayout() 
     layout.addRow("Name", QLineEdit()) 
     layout.addRow("Address", QLineEdit()) 
     # self.setTabText(0,"Contact Details") 
     self.stack1.setLayout(layout) 

    def stack2UI(self): 
     layout = QFormLayout() 
     sex = QHBoxLayout() 
     sex.addWidget(QRadioButton("Male")) 
     sex.addWidget(QRadioButton("Female")) 
     layout.addRow(QLabel("Sex"), sex) 
     layout.addRow("Date of Birth", QLineEdit()) 

     self.stack2.setLayout(layout) 

    def stack3UI(self): 
     layout = QHBoxLayout() 
     layout.addWidget(QLabel("subjects")) 
     self.physicsCheckBox = QCheckBox("Physics") 
     layout.addWidget(self.physicsCheckBox) 
     self.physicsCheckBox.stateChanged.connect(self.physicsCheckBoxStateChanged) 

     layout.addWidget(QCheckBox("Maths")) 
     self.stack3.setLayout(layout) 


    def physicsCheckBoxStateChanged(self, state): 
     isChecked = bool(state) # Convert from Qt.CheckState 
     print("physicsCheckBox: {}".format(isChecked)) 

    def display(self, i): 
     self.stack.setCurrentIndex(i) 


def main(): 
    app = QApplication(sys.argv) 
    ex = stackedExample() 
    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main() 

P.S. Ich habe self.Stack in self.stack umbenannt. Es ist eine Python-Konvention, dass Klassendefinitionen mit Großbuchstaben und regulären Variablen beginnen und mit Kleinbuchstaben funktionieren.