Как излучать один и тот же сигнал на 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()