2016-07-21 4 views
0

Я хочу это сделать: Существует класс под названием «Главная». Существует еще один класс, называемый «aClass». И есть класс, который называется «Thread». Это наш класс потоков. «Главный» - наш основной класс, и мы начинаем наш класс Thread из основного класса. Когда начат наш класс Thread, он испускает сигнал функции run() ... Классы «Основной» и «Класс» пытаются поймать эти сигналы. «Основной» класс способен поймать сигнал, который испускался из класса Thread, но «aClass» не может поймать тот же сигнал, потому что я не запускал QThread из «aClass». Я только определил его в «aClass».Как испустить один и тот же сигнал для 2 классов от QThread

Вот коды:

#!/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

Что вы делаете, создавая в aClass объект, который не является тем же самым Thread как в Main второй Thread. Вам необходимо подключить сигнал от self.thread в Main к слоту write в вашем self.aClass объекте.

Вы хотите сделать это вместо:

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

Смежные вопросы