2012-01-09 2 views
1

"Rapid Gui Programming with Python and Qt"와 관련하여 신호/슬롯 프로젝트에 문제가 있습니다. 저자 코드를 내 자신과 비교할 코드를 다운로드했고, 모두 똑같아 보이지만 파생 된 스핀 상자 클래스에서 신호를 내면 python이 충돌합니다.PySide 방출 신호로 인해 파이썬이 충돌합니다.

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

class ZeroSpinBox(QSpinBox): 
    zeros = 0 

    def __init__(self, parent=None): 
     super(ZeroSpinBox, self).__init__(parent) 
     self.connect(self, SIGNAL("valueChanged(int)"), self.checkzero) 

    def checkzero(self): 
     if self.value() == 0: 
      self.zeros += 1 
      self.emit(SIGNAL("atzero"), self.zeros) 

class Form(QDialog): 
    def __init__(self, parent= None): 
     super(Form, self).__init__(parent) 

     dial = QDial() 
     dial.setNotchesVisible(True) 
     spinbox = ZeroSpinBox() 
     spinbox.setRange(0,200) 
     dial.setRange(0,200) 

     layout = QHBoxLayout() 
     layout.addWidget(dial) 
     layout.addWidget(spinbox) 
     self.setLayout(layout) 

     self.connect(dial, SIGNAL("valueChanged(int)"), spinbox, SLOT("setValue(int)")) 
     self.connect(spinbox, SIGNAL("valueChanged(int)"), dial, SLOT("setValue(int)")) 
     self.connect(spinbox, SIGNAL("atzero"), self.announce) 

     self.setWindowTitle("Signals and Slots Part 2") 

    def announce(self, zeros): 
     print "ZeroSpinBox has been at zero %d times" % zeros 


if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    form = Form() 
    form.show() 
    app.exec_() 

spinbox가 다운이 제로가 될 때 내 문제가 발생하면 checkzero (자기) 메소드가합니다 (ZeroSpinBox 클래스의)는 self.zeros가 + = 1 개 라인 호출됩니다 : 여기에 내가 가지고있는 전체 코드입니다 좋아, 다음 방출 라인 창에서 Python.exe가 추락했다고보고합니다. 내가 얻는 오류는 "python.exe가 작동을 멈췄습니다"이고 콘솔에 "프로세스가 종료 코드 -1073741819로 끝났습니다"라고 표시됩니다.

왜 이런 일이 발생하는지 알고 싶습니다. 이것은 파이썬 2.7.2 및 PySide가있는 PyQT4입니다.

+0

방출하고, 동일한 것을 시도한 다른 프로그램을 시도 ... – Mike

답변

4

SIGNAL("atzero")SIGNAL("atzero(int)")을 모두 checkzeroForm.__init__으로 바꾸십시오. 왜냐하면 신고하는 방식이 아무런 논쟁 거리가 아니기 때문입니다.

편집

: "새로운 스타일"의 코드,

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

class ZeroSpinBox(QSpinBox): 
    zeros = 0 

    def __init__(self, parent=None): 
     super(ZeroSpinBox, self).__init__(parent) 
     self.valueChanged.connect(self.checkzero) 

    atzero = Signal(int) 

    def checkzero(self): 
     if self.value() == 0: 
      self.zeros += 1 
      self.atzero.emit(self.zeros) 

class Form(QDialog): 
    def __init__(self, parent= None): 
     super(Form, self).__init__(parent) 

     dial = QDial() 
     dial.setNotchesVisible(True) 
     spinbox = ZeroSpinBox() 
     spinbox.setRange(0,200) 
     dial.setRange(0,200) 

     layout = QHBoxLayout() 
     layout.addWidget(dial) 
     layout.addWidget(spinbox) 
     self.setLayout(layout) 

     dial.valueChanged.connect(spinbox.setValue) 
     spinbox.valueChanged.connect(dial.setValue) 
     spinbox.atzero.connect(self.announce) 

     self.setWindowTitle("Signals and Slots Part 2") 

    @Slot(int) 
    def announce(self, zeros): 
     print "ZeroSpinBox has been at zero %d times" % zeros 


if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    form = Form() 
    form.show() 
    app.exec_() 
+0

고마워, 고쳐. 그러나이 책은 특히 괄호 안 쓰지 말라고 말하면서 "단락 회로"신호를 발생시킨다. 나는 그것에 대해 더 깊이 연구 할 것이고, 당신의 대답에 감사 할 것이다. – Mike

+1

"단락 회로"신호가 PySide를 위해 가져 오지 않은 PyQT 기능이라고 생각해보십시오. 미래의 독자를 위해, 이것은 막연하게 만져지지만, PySide로는 일어나지 않는다는 것을 알기에 충분하다고 설명합니다. - http://developer.qt.nokia.com/wiki/Differences_Between_PySide_and_PyQt#5fa7b08138cabe061590146f6da8a2a0 – Mike

+0

그런 의미로는 알 수 없습니다. 또한 코드를 PyQt/PySide의 새로운 스타일의 Slot/Signal 구문으로 변환하려고했지만 잘못된 이유로이 코드를 번역했습니다. –

2

here을 (설명되어 PySide와 PyQt4의 차이로 인해이 사실, 엄밀히 말하면,이 PySide에서 문제 - 지원되지 않는 신호 구문을 사용하면 응용 프로그램이 충돌하지 않고 오류가 발생합니다.

사용중인 책은 PyQt4 용으로 특별히 제작되었으므로 PySide와 PyQt4를 사용할 때의 차이점을 알고 있어야 할 것입니다. 예를 들어 here을 참조하십시오.

스크립트의 PyQt4 버전은 신호의 괄호로 묶은 부분을 포함하거나 포함하지 않은 상태에서 올바르게 작동합니다. 문제는 모두 동일하다는 것입니다. 그러나 이것은 사용자 정의 신호 인 신호에만 해당됩니다. 미리 정의 된 Qt 신호 및 슬롯의 경우 항상 괄호 안의 서명 부분을 포함해야합니다.

당신이 알고 있어야 할 또 하나의 사실은 사용중인 신호/슬롯 구문이 훨씬 더 파이썬적인 새로운 스타일 구문을 능가한다는 것입니다. 그러므로 어떤 점에서 책이 그것을 커버하지 않는다면 지침서 here을 통해 가치있는 독서가 될 것입니다.

+0

감사합니다. 나는이 책이 PyQt4를위한 것이라는 것을 알았지 만, 처음에는 PyStide와 PySide의 차이점에 대해 많이 알지 못했다. 새로운 신호/슬롯 구문을 살펴보고 포인터에 감사드립니다. – Mike

관련 문제