如何从 QThread 为 2 个类发出相同的信号
How to emit same signal for 2 classess from QThread
我想这样做:
有一个叫做 'Main' 的 class。还有一个 class 叫做 'aClass'。还有第三个 class 称为 'Thread'。这是我们的线程 class。
'Main' 是我们的主要 class,我们从 Main class 开始我们的线程 class。
当我们的线程 class 启动时,它会从 运行() 函数发出信号...
'Main' 和 'aClass' class 试图捕捉这些信号。
'Main' class 能够捕获从线程 class 发出的信号,但是 'aClass' 无法捕获相同的信号,因为我没有从 [=30 启动 QThread =].我只定义在'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...
当我点击 'Start Process' 按钮时,输出是:
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...
点击'Start Process'想要得到的输出:
Thread: I emitted the message.
Main: hello world...
aClass: hello world...
我想要这个结果,但我不想使用 'aClass' 中的 self.thread.start() 命令,因为我只想 运行 线程一次...
您正在做的是在 aClass
对象中创建第二个 Thread
,它与 Main
中的 Thread
不同。您需要将 Main
中 self.thread
的信号连接到 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()
我想这样做: 有一个叫做 'Main' 的 class。还有一个 class 叫做 'aClass'。还有第三个 class 称为 'Thread'。这是我们的线程 class。 'Main' 是我们的主要 class,我们从 Main class 开始我们的线程 class。 当我们的线程 class 启动时,它会从 运行() 函数发出信号... 'Main' 和 'aClass' class 试图捕捉这些信号。 'Main' class 能够捕获从线程 class 发出的信号,但是 'aClass' 无法捕获相同的信号,因为我没有从 [=30 启动 QThread =].我只定义在'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...
当我点击 'Start Process' 按钮时,输出是:
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...
点击'Start Process'想要得到的输出:
Thread: I emitted the message.
Main: hello world...
aClass: hello world...
我想要这个结果,但我不想使用 'aClass' 中的 self.thread.start() 命令,因为我只想 运行 线程一次...
您正在做的是在 aClass
对象中创建第二个 Thread
,它与 Main
中的 Thread
不同。您需要将 Main
中 self.thread
的信号连接到 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()