2016-07-21 8 views
0

私はしたい: 'Main'と呼ばれるクラスがあります。 'aClass'と呼ばれる別のクラスがあります。そして、「スレッド」と呼ばれるクラスがあります。それは私たちのスレッドクラスです。 メインはメインクラスで、メインクラスからスレッドクラスを開始します。 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... 

私はこの結果をしたいが、私は(self.thread.startを使用したくない)コマンドAClassは「から「私は...一度だけのためのスレッドを実行するため

+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

'aClass .__ init__'の引数として' self.thread'を与えて、現在の 'connect'行を保持することもできます。 – Frodon

+0

ありがとうございます。私の問題は解決されました... – PIC16F84A

関連する問題