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_())

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值