2016-07-21 5 views
0

내가하고 싶습니다 : 'Main'이라는 클래스가 있습니다. 'aClass'라는 또 다른 클래스가 있습니다. 그리고 '스레드 (Thread)'라는 제목의 클래스가 있습니다. 우리 스레드 클래스입니다. 'Main'이 메인 클래스이고 Main 클래스에서 Thread 클래스를 시작합니다. Thread 클래스가 시작되면 run() 함수에서 신호를 내 보냅니다 ... 'Main'과 'aClass'클래스는이 신호를 잡으려고합니다. 'Main'클래스는 Thread 클래스에서 방출 된 신호를 잡을 수 있지만 'aClass'에서 QThread를 시작하지 않았기 때문에 'aClass'는 동일한 신호를 포착 할 수 없습니다. 나는 'aClass'에서만 정의했다.QThread에서 2 등급에 대해 동일한 신호를 방출하는 방법

#!/usr/bin/env python 

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


class Main(QMainWindow): 
    def __init__(self): 
     QMainWindow.__init__(self) 

     self.setWindowTitle("Test") 
     self.aClass = aClass() 

     self.thread = Thread() 
     self.thread.printMessage.connect(self.write) 
     self.initUI() 

    def initUI(self): 
     self.button = QPushButton("Start Process", self) 
     self.button.clicked.connect(self.startProcess) 

    def startProcess(self): 
     self.thread.start() 

    def terminateProcess(self): 
     self.thread.terminate() 

    def write(self): 
     print "Main: hello world..." 


class aClass(object): 
    def __init__(self): 
     print "aClass: I have been started..." 
     self.thread = Thread() 
     self.thread.printMessage.connect(self.write) 

    def write(self): 
     print "aClass: hello world..." 

class Thread(QThread): 
    printMessage = pyqtSignal() 

    def __init__(self): 
     QThread.__init__(self) 
     print "Thread: I have been started..." 

    def run(self): 

     self.printMessage.emit() 
     print "Thread: I emitted the message." 

if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    root = Main() 
    root.show() 
    app.exec_() 

결과는 : 프로그램이 시작되면 는, 출력은 다음과 같습니다

내가 '프로세스 시작'버튼을 클릭
aClass: I have been started... 
Thread: I have been started... 
Thread: I have been started... 

, 출력은 다음과 같습니다

여기에 코드입니다

Thread: I emitted the message. 
Main: hello world... 

총 출력 :

,
aClass: I have been started... 
Thread: I have been started... 
Thread: I have been started... 
Thread: I emitted the message. 
Main: hello world... 

내가 싶어 출력 내가 '시작'을 클릭 :이 결과를 원하는

Thread: I emitted the message. 
Main: hello world... 
aClass: hello world... 

을하지만 난 aClass '에서 self.thread.start() 명령을 사용하지 않으 '나는 ... 한 번만 스레드를 실행하려는 때문에

+0

당신은 동일한 스레드에서 동일한 신호를 얻기 위해 노력하고 있습니까? –

+0

예. 내 문제가 해결되었습니다. – PIC16F84A

답변

0

당신이 Main와 동일 Thread되지 않습니다 aClass 객체에 두 번째 Thread을 만드는하고있다. self.thread에서 Main에있는 신호를 self.aClass 개체의 슬롯 write에 연결해야합니다.

대신이 작업을 수행 할 수 :

class Main(QMainWindow): 
    def __init__(self): 
     QMainWindow.__init__(self) 

     self.setWindowTitle("Test") 
     self.aClass = aClass() 

     self.thread = Thread() 
     self.thread.printMessage.connect(self.write) 
     self.thread.printMessage.connect(self.aClass.write) 


... 

class aClass(object): 
    def __init__(self): 
     print "aClass: I have been started..." 
     #self.thread = Thread() #This makes a new Thread 
     #self.thread.printMessage.connect(self.write) 

    def write(self): 
     print "aClass: hello world..." 
     self.initUI() 
+1

또한'self.thread'를'aClass .__ init__'의 인자로 주어 현재의'connect' 라인을 유지할 수 있습니다. – Frodon

+0

감사합니다. 내 문제가 해결되었습니다 ... – PIC16F84A