在 PyQt5 中,要使用信号和插槽(signals and slots)在两个 QThread 之间进行通信,你需要确保每个 QThread 都有一个 QObject 作为事件循环的代理,并且正确地连接信号和插槽。以下是一个简单的例子,展示了如何在两个 QThread 之间使用信号和插槽进行通信:
import sys
from PyQt5.QtCore import QObject, pyqtSignal, QThread
# 定义一个信号发送者类
class SignalEmitter(QObject):
# 定义一个信号
signal = pyqtSignal(str)
def __init__(self):
super().__init__()
def send_signal(self, message):
# 发送信号
self.signal.emit(message)
# 定义一个信号接收者类
class SignalReceiver(QObject):
def __init__(self):
super().__init__()
# 定义一个槽函数
def receive_signal(self, message):
print(f"Received: {message}")
# 创建两个线程
thread1 = QThread()
thread2 = QThread()
# 创建信号发送者和接收者对象
emitter = SignalEmitter()
receiver = SignalReceiver()
# 将信号发送者和接收者移动到各自的线程
emitter.moveToThread(thread1)
receiver.moveToThread(thread2)
# 连接信号和槽
emitter.signal.connect(receiver.receive_signal)
# 启动线程
thread1.started.connect(lambda: emitter.send_signal("Hello from Thread 1"))
thread1.start()
thread2.start()
# 当线程完成时,退出应用程序
thread1.finished.connect(sys.exit)
thread2.finished.connect(sys.exit)
# 注意:在实际应用中,你可能需要更复杂的逻辑来管理线程的生命周期,
# 以及处理线程间的同步和数据传递。
在这个例子中,我们创建了两个 QThread 对象,每个线程都有一个 QObject 作为事件循环的代理。SignalEmitter
类有一个信号 signal
,而 SignalReceiver
类有一个槽函数 receive_signal
。我们使用 moveToThread
方法将信号发送者和接收者移动到各自的线程,并使用 connect
方法将信号和槽连接起来。当 thread1
启动时,它会发送一个信号,这个信号会被 thread2
中的接收者槽函数捕获并处理。
请注意,这个例子中的线程启动后不会自动结束,因为没有定义线程的退出条件。在实际应用中,你可能需要在线程的 run
方法中定义退出条件,或者使用其他机制来管理线程的生命周期。此外,线程间的同步和数据传递可能需要更复杂的逻辑来确保线程安全。
领取专属 10元无门槛券
手把手带您无忧上云