2013-07-21 6 views
0

글쎄, 나는 Qt에 익숙하지만, PyQt를 사용할 때 signal/slot의 구문이 나를 혼란스럽게 만든다. C++/Qt를 사용할 때, 컴파일러는 신호/슬롯에 대한 잘못된 점을 알려줄 것입니다. 그러나 PyQt 기본 설정은 오류에 대한 힌트를 제공하지 않습니다. PyQt가 더 많은 정보를 표시 할 수있게하는 디버그 트리거 모드와 같은 방법이 있습니까? 코드는 다음과 같습니다 :사용자 정의 신호/슬롯을 처리 할 때 PyQt와 Qt의 차이점

C++에서
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
import time 

class workThread(QThread): 

    def __init__(self,parent = None): 
     super(workThread,self).__init__(parent) 
     self.mWorkDoneSignal = pyqtSignal() ## some people say this should be defined as clas member, however, I defined it as class member and still fails. 

    def run(self): 
     print "workThread start" 
     time.sleep(1) 
     print "workThread stop" 
     print self.emit(SIGNAL("mWorkDoneSignal")) 

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

    @pyqtSlot() 
    def display(self): 
     print "dispaly" 

if __name__ == "__main__": 
    import sys 
    app = QApplication(sys.argv) 
    c = workThread() 
    d = MainWidget() 
    ##In Qt, when using QObject::connect or such things, the return value will show the 
    ## signal/slot binding is success or failed 
    print QObject.connect(c,SIGNAL('mWorkDoneSignal()'),d,SLOT('display()')) 
    c.start() 
    d.show() 
    app.exec_() 

는 QObject를 :: 바인딩 신호/슬롯을 보여줍니다 반환 값을 연결 성공 여부이다. PyQt에서 반환 값은 True이지만 슬롯을 트리거하지는 않습니다. 내 질문 : 1) 신호는 클래스 멤버 또는 인스턴스 멤버입니까? 2) QObject.connect의 반환 값이 바인딩 성공에 대한 힌트를 줄 수 없다면이를 감지하는 다른 방법이 있습니까? 신호 발신자와 슬롯 수신기 외부의 신호/슬롯을 바인딩하려고하므로 QObject.connect 방법을 사용합니다. 하지만 어떻게이 글을 쓸 수 있을까요? 다음과 같은 방법으로 시도해 보았습니다. 둘 다 실패합니다.

QObject.connect(c,SIGNAL('mWorkDoneSignal'),d,SLOT('display')) 
QObject.connect(c,SIGNAL('mWorkDoneSignal()'),d,SLOT('display()')) 

답변

1

첫째, 당신은 정말 PyQt는 함께 new style signals을 사용해야합니다. 사실 QObject.connectQObject.emit은 더 이상 존재하지 않습니다. in PyQt5.

def __init__(self,parent = None): 
    super(workThread,self).__init__(parent) 
    self.mWorkDoneSignal = pyqtSignal() 

이 언 바운드 신호를 생성하고 인스턴스 변수 mWorkDoneSignal에 할당, 느릅 나무는 정말 dosn't 효과가있다. 신호를 만들고 싶다면 실제로 클래스에 선언해야합니다. 당신이 정말로 여기 신호를 생성하지 않은 경우

그래서, 왜이 호출이 성공 않았다

QObject.connect(c,SIGNAL('mWorkDoneSignal()'),d,SLOT('display()')) 

을 대답은 PyQt4에 의해 handling of old style signals에있다 :

을 방출하는 행위를 PyQt4 신호는 그것을 암시 적으로 정의합니다.

신호를 슬롯에 연결할 때 슬롯의 존재 여부 만 확인됩니다. 신호 자체는 실제로 그 지점에 존재할 필요가 없으므로 슬롯이 존재하지 않으면 호출은 항상 성공합니다.

나는 둘 다 실패한다. (괄호)없이 display 유효한 슬롯이 없기 때문에

QObject.connect(c,SIGNAL('mWorkDoneSignal'),d,SLOT('display')) 
QObject.connect(c,SIGNAL('mWorkDoneSignal()'),d,SLOT('display()')) 

제 실패.
두 번째로 성공했습니다. 당신이 mWorkDoneSignal을 방출,하지만 당신이 실제로 방출해야 할 것은 때문에 작동하지 않는 이유는 다음과 같습니다

from utils import sigint 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
import time 

class workThread(QThread): 

    mWorkDoneSignal = pyqtSignal() 

    def __init__(self,parent = None): 
     super(workThread,self).__init__(parent) 

    def run(self): 
     print "workThread start" 
     time.sleep(1) 
     print "workThread stop" 
     self.mWorkDoneSignal.emit() 

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

    @pyqtSlot() 
    def display(self): 
     print "dispaly" 

if __name__ == "__main__": 
    import sys 
    app = QApplication(sys.argv) 
    c = workThread() 
    d = MainWidget() 
    c.mWorkDoneSignal.connect(d.display) 
    c.start() 
    d.show() 
    app.exec_() 
: 새로운 스타일 신호를 사용

self.emit(SIGNAL("mWorkDoneSignal()")) 

이 최대와 같은 일을 엉망으로 할 수있는 방법이 없습니다