2016-04-09 9 views
1

、QStackedWidgetでのstateChanged信号の設定、ウィッヒは、それぞれの子のために独自のレイアウトを作成するに(下)私は、インターネットからQStackedウィジェットコードの例を持って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() 

今私はそれらのすべてからデータを収集したいとそれを後で処理する。チェックボックスがオンになっていることを確認するにはどうすればよいですか?あなたは物理学のチェックボックスを検索しません

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

を書きますが、それは新しいチェックボックスを作成すると、このコード

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

は私に

Process finished with exit code -1073741819 (0xC0000005) 

答えて

0

を与えます。 Pythonへの参照を保持しないので、コンストラクタを終了した後に破棄されます。しかし、それはまだ信号に接続されており、予測できない動作につながります。

元のチェックボックスに接続する場合は、そのチェックボックスを参照する必要があります。同様に:

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. self.Stackの名前をself.stackに変更しました。クラス定義を大文字と通常の変数で始まり、小文字で機能させるのはPythonの規約です。

関連する問題