qpython thread_Python在两个qthread之间发送信号

该博客介绍了如何在PyQt5中使用QThread和worker对象进行跨线程通信。通过创建一个AuthWorker类,演示了如何在线程中运行任务并在完成后发射信号。主线程中的Worker类接收这个信号并处理结果,展示了如何避免直接在UI线程中执行长时间运行的任务,以保持界面的响应性。
摘要由CSDN通过智能技术生成

如果重写QThread的run方法,则除非显式调用其exec方法,否则它不会启动自己的事件循环。处理跨线程信号需要事件循环。因此,通常最好创建一个worker对象并将其移动到线程中,而不是重写run。在

下面是一个演示脚本,演示如何在线程中使用worker对象:import sys

from PyQt5 import QtWidgets, QtCore

class AuthWorker(QtCore.QObject):

authenticate = QtCore.pyqtSignal()

def __init__(self):

super(AuthWorker, self).__init__()

def run(self):

QtCore.QThread.sleep(0.5)

self.authenticate.emit()

class Worker(QtCore.QObject):

finished = QtCore.pyqtSignal(str)

authenticator = "n"

def __init__(self, parent=None):

super(Worker, self).__init__(parent)

self.auth = AuthWorker()

self.auth_thread = QtCore.QThread()

self.auth.moveToThread(self.auth_thread)

self.auth.authenticate.connect(self.setauthentication)

self.auth_thread.started.connect(self.auth.run)

def setauthentication(self):

self.authenticator = "y"

def run(self):

self.auth_thread.start()

QtCore.QThread.sleep(1)

self.finished.emit('auth: %s' % self.authenticator)

class Window(QtWidgets.QWidget):

def __init__(self):

super(Window, self).__init__()

self.button = QtWidgets.QPushButton('Test', self)

self.button.clicked.connect(self.handleButton)

self.edit = QtWidgets.QLineEdit(self)

self.edit.setReadOnly(True)

layout = QtWidgets.QVBoxLayout(self)

layout.addWidget(self.edit)

layout.addWidget(self.button)

self.thread = QtCore.QThread()

self.worker = Worker()

self.worker.moveToThread(self.thread)

self.worker.finished.connect(self.handleFinished)

self.thread.started.connect(self.worker.run)

def handleFinished(self, text):

self.thread.quit()

self.edit.setText(text)

def handleButton(self):

if not self.thread.isRunning():

self.edit.clear()

self.thread.start()

if __name__ == '__main__':

app = QtWidgets.QApplication(sys.argv)

window = Window()

window.setGeometry(600, 100, 200, 100)

window.show()

sys.exit(app.exec_())

好的,以下是一个简单的QThread使用范例: ```python from PyQt5.QtCore import QThread, pyqtSignal import time class MyThread(QThread): # 定义信号,用于在线程中更新UI update_signal = pyqtSignal(str) def __init__(self, parent=None): super().__init__(parent) def run(self): # 在这里编写线程的业务逻辑 for i in range(5): time.sleep(1) self.update_signal.emit(f'当前进度:{i+1}') if __name__ == '__main__': from PyQt5.QtWidgets import QApplication, QLabel, QVBoxLayout, QPushButton, QWidget app = QApplication([]) window = QWidget() layout = QVBoxLayout() label = QLabel('等待线程执行...') layout.addWidget(label) button = QPushButton('开始线程') layout.addWidget(button) thread = MyThread() def update_ui(text): # 接收信号,并在线程中更新UI label.setText(text) thread.update_signal.connect(update_ui) def start_thread(): # 点击按钮,启动线程 button.setText('线程执行中...') button.setEnabled(False) thread.start() button.clicked.connect(start_thread) window.setLayout(layout) window.show() app.exec_() ``` 在这个例子中,我们创建了一个名为MyThread的子类,继承了QThread类。在run方法中编写了线程的业务逻辑,并且通过定义一个update_signal信号,将线程的进度信息发送线程中更新UI。 在线程中,我们创建了一个简单的界面,有一个标签用于展示线程进度信息,和一个按钮用于启动线程。当点击按钮时,程序会启动线程,并且将按钮禁用,防止重复点击。 当线程运行时,每一秒钟会通过update_signal信号发送一条进度信息到线程中,线程接收到信号后,会将信息更新到标签中。当线程运行完毕后,按钮会重新启用,可以再次点击启动线程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值