Как излучать один и тот же сигнал на 2 класса из QThread

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

Вот коды:

#!/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', потому что я хочу запустить Thread только один раз...

1 ответ

Решение

То, что вы делаете, это создание второго Thread в aClass объект, который не является тем же Thread как в Main, Вам необходимо подключить сигнал от 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()
Другие вопросы по тегам