Pyqt中QThread传递自己定义的参数、类、函数

Pyqt中QThread传递自己定义的参数、类、函数

  • 1 pyqt中Qthread传递自己定义的参数
  • 2 pyqt中Qthread传递自己定义的类
  • 3 pyqt中Qthread传递自己定义的函数
  • 4 pyqt中Qthread内部定义自己的函数
  • 5 pyqt中Qthread传递参数到内部定义自己的函数

1 pyqt中Qthread传递自己定义的参数

在PyQt中,当你想要在一个线程中传递自己的参数时,你可以通过子类化QThread并重写run方法来实现。然后你可以通过构造函数传递参数,并在run方法中使用这些参数。下面是一个简单的例子:

import sys
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QWidget, QPushButtonclass WorkerThread(QThread):# 定义一个信号,用于向主线程发送数据data_sent = pyqtSignal(str)def __init__(self, parent=None, data=None):super(WorkerThread, self).__init__(parent)self.data = datadef run(self):# 在这里处理数据,然后发送信号processed_data = self.data.upper()  # 假设这是一个简单的处理过程self.data_sent.emit(processed_data)class MainWindow(QWidget):def __init__(self, parent=None):super(MainWindow, self).__init__(parent)self.init_ui()def init_ui(self):self.button = QPushButton('Start Thread', self)self.button.clicked.connect(self.start_thread)self.setGeometry(300, 300, 290, 150)self.show()def start_thread(self):# 创建线程并传递数据self.thread = WorkerThread(data="Hello, World!")self.thread.data_sent.connect(self.on_data_received)self.thread.start()def on_data_received(self, data):print(f"Received data: {data}")if __name__ == '__main__':app = QApplication(sys.argv)window = MainWindow()sys.exit(app.exec_())

在这里插入图片描述

在这个例子中,我们创建了一个名为WorkerThread的子类,它有一个data属性,用于存储要处理的数据。我们在run方法中处理数据,并通过data_sent信号发送处理后的数据。

在MainWindow类中,我们创建了一个按钮,当用户点击这个按钮时,会启动一个新的线程,并传递一些数据。然后我们连接data_sent信号到一个槽函数on_data_received,以便在主线程中接收数据。

请注意,由于PyQt的信号和槽机制是线程安全的,因此可以在不同线程之间安全地传递数据和事件。

2 pyqt中Qthread传递自己定义的类

在PyQt中,你也可以通过继承QThread并重写run方法来传递自己的类实例。为了能够在线程之间安全地传递类实例,你可能需要确保类是可序列化的,或者使用一些线程安全的方法来共享数据。以下是一个示例,我们将传递一个简单的类实例,该类包含一些数据和一个方法:

import sys
from PyQt5.QtCore import QThread, pyqtSignal, QObject
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton# 定义一个简单的类,包含一些数据和方法
class MyData(QObject):text_sent = pyqtSignal(str)def __init__(self, text):super(MyData, self).__init__()self.text = textdef process(self):# 假设这是一个需要处理的数据方法processed_text = self.text.upper()  # 假设这是一个简单的处理过程self.text_sent.emit(processed_text)return self.text.upper()# 定义线程类,用于处理数据
class WorkerThread(QThread):# 定义一个信号,用于向主线程发送处理后的数据data_processed = pyqtSignal(str)def __init__(self, parent=None, data=None):super(WorkerThread, self).__init__(parent)self.data = datadef run(self):# 在这里处理数据,然后发送信号if self.data is not None:processed_data = self.data.process()self.data_processed.emit(processed_data)# 主窗口类
class MainWindow(QWidget):def __init__(self, parent=None):super(MainWindow, self).__init__(parent)self.init_ui()def init_ui(self):self.button = QPushButton('Start Thread', self)self.button.clicked.connect(self.start_thread)self.setGeometry(300, 300, 290, 150)self.show()def start_thread(self):# 创建要传递的数据实例self.data_instance = MyData("Hello, World!")# 创建线程并传递数据实例self.thread = WorkerThread(data=self.data_instance)self.thread.data_processed.connect(self.on_data_processed)self.data_instance.text_sent.connect(self.on_text_processed)self.thread.start()def on_data_processed(self, data):print(f"Processed data: {data}")def on_text_processed(self, data):print(f"Text data: {data}")if __name__ == '__main__':app = QApplication(sys.argv)window = MainWindow()sys.exit(app.exec_())

在这里插入图片描述
在这个例子中,MyData类继承自QObject,因此它可以包含信号和槽,并且是线程安全的。我们创建了一个MyData的实例,并将其传递给WorkerThread。在WorkerThread中,我们调用MyData实例的process方法,并通过信号将结果发送回主线程。

在 MyData中定义了text_sent信号到on_text_processed槽函数,在主线程中,我们连接了data_processed信号到on_data_processed槽函数,以便接收处理后的数据。

请记住,如果你的类包含了一些资源或状态信息,你可能需要实现适当的线程安全措施,或者确保类的实例是只读的,以避免多线程并发访问时出现问题。

3 pyqt中Qthread传递自己定义的函数

在PyQt中,你可以使用QThread来运行你自己的函数,但是需要注意的是,PyQt不是线程安全的。如果你在多线程环境中直接修改PyQt对象(包括UI对象),可能会导致程序崩溃。因此,通常我们应该避免在多线程中直接操作UI,而是使用信号和槽机制来进行通信。

以下是一个示例,我们将创建一个QThread子类,并在其中运行一个我们自己定义的函数。我们将通过信号来返回函数的结果。

import sys
from PyQt5.QtCore import QThread, pyqtSignal, QObject
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton,QTextEdit# 这是你想要在新线程中运行的函数
def some_function(text):# 假设这里有一些耗时的处理processed_text = text.upper()return processed_text# 定义线程类,用于运行我们的函数
class WorkerThread(QThread):# 定义一个信号,用于向主线程发送函数结果function_finished = pyqtSignal(str)def __init__(self, parent=None, function=None, args=None):super(WorkerThread, self).__init__(parent)self.function = functionself.args = argsdef run(self):# 检查函数和参数是否存在if self.function is not None and self.args is not None:result = self.function(*self.args)self.function_finished.emit(result)# 主窗口类
class MainWindow(QWidget):def __init__(self, parent=None):super(MainWindow, self).__init__(parent)self.init_ui()def init_ui(self):self.button = QPushButton('Start Thread', self)self.button.setGeometry(250, 500, 150, 50)self.button.clicked.connect(self.start_thread)self.lb = QTextEdit('',self)self.lb.setGeometry(50,50,500,400)self.setGeometry(300, 300, 600, 600)self.show()def start_thread(self):# 创建线程并传递函数和参数self.thread = WorkerThread(function=some_function, args=("Hello, World!",))self.thread.function_finished.connect(self.on_function_finished)self.thread.start()def on_function_finished(self, result):self.lb.append(f"Function result: {result}")# QApplication.processEvents()	#刷新uiprint(f"Function result: {result}")if __name__ == '__main__':app = QApplication(sys.argv)window = MainWindow()sys.exit(app.exec_())

在这里插入图片描述
在这个例子中,我们定义了一个名为WorkerThread的线程类,它接受一个函数和参数作为输入,并在run方法中调用该函数。函数的结果通过信号function_finished发送回主线程,然后在主线程中通过槽函数on_function_finished打印出来。在这里定义了一个textEdit用于实时显示更新线程响应内容。

请记住,如果你想在新线程中更新UI,你应该使用pyqtSignal来发出更新UI的请求,而不是直接在新线程中操作UI对象。

4 pyqt中Qthread内部定义自己的函数

在PyQt中,如果你想在QThread内部定义自己的函数,并在这个线程中运行它,你可以直接在QThread的子类中定义该函数,并重写run方法来调用它。下面是一个例子,演示了如何在QThread内部定义函数并运行它:

import sys
from PyQt5.QtCore import QThread, pyqtSignal, QObject
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
'''在QThread内部自定义函数'''
# 定义线程类,并在其中定义函数
class WorkerThread(QThread):# 定义一个信号,用于向主线程发送函数结果function_finished = pyqtSignal(str)def __init__(self, parent=None):super(WorkerThread, self).__init__(parent)def run(self):# 调用我们在线程内部定义的函数result = self.some_function("Hello, World!")self.function_finished.emit(result)# 定义在线程内部运行的函数def some_function(self, text):# 这里可以放置耗时的处理逻辑processed_text = text.upper()return processed_text# 主窗口类
class MainWindow(QWidget):def __init__(self, parent=None):super(MainWindow, self).__init__(parent)self.init_ui()def init_ui(self):self.button = QPushButton('Start Thread', self)self.button.clicked.connect(self.start_thread)self.setGeometry(300, 300, 290, 150)self.show()def start_thread(self):# 创建线程并启动self.thread = WorkerThread()self.thread.function_finished.connect(self.on_function_finished)self.thread.start()def on_function_finished(self, result):print(f"Function result: {result}")if __name__ == '__main__':app = QApplication(sys.argv)window = MainWindow()sys.exit(app.exec_())

在这里插入图片描述
在这个例子中,WorkerThread类继承自QThread,并定义了一个名为some_function的内部函数。这个函数会在run方法被调用时执行。run方法结束后,我们通过信号function_finished发送结果给主线程,然后在主线程中通过槽函数on_function_finished打印结果。

注意,这种方式不需要我们传递函数和参数给QThread,因为它们已经在类的内部定义好了。如果你想改变执行的函数或传递不同的参数,你可以在子类中重写run方法,或者添加额外的初始化参数来实现。

5 pyqt中Qthread传递参数到内部定义自己的函数

在PyQt中,我们可以通过多种方式将参数传递给QThread子类内部定义的函数。以下是几种常见的做法:

1. 通过构造函数传递参数
在创建QThread子类的实例时,可以在构造函数中传递参数,并在内部保存这些参数以便后续使用。

import sys
from PyQt5.QtCore import QThread, pyqtSignal, QObject
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
'''向QThread内部传递参数并内部自定义函数'''
# 定义线程类,并在其中定义函数
class WorkerThread(QThread):# 定义一个信号,用于向主线程发送函数结果function_finished = pyqtSignal(str)def __init__(self, parent=None,text=None):super(WorkerThread, self).__init__(parent)self.text = textdef run(self):if self.text is not None:# 调用我们在线程内部定义的函数result = self.some_function(*self.text)	#传入指针,指向内容self.function_finished.emit(result)# 定义在线程内部运行的函数def some_function(self, text):# 这里可以放置耗时的处理逻辑processed_text = text.upper()return processed_text# 主窗口类
class MainWindow(QWidget):def __init__(self, parent=None):super(MainWindow, self).__init__(parent)self.init_ui()def init_ui(self):self.button = QPushButton('Start Thread', self)self.button.clicked.connect(self.start_thread)self.setGeometry(300, 300, 290, 150)self.show()def start_thread(self):# 创建线程并启动self.thread = WorkerThread(text=('Start Thread',))self.thread.function_finished.connect(self.on_function_finished)self.thread.start()def on_function_finished(self, result):print(f"Function result: {result}")if __name__ == '__main__':app = QApplication(sys.argv)window = MainWindow()sys.exit(app.exec_())

在这里插入图片描述
注意,当多个参数传入时,text=('Start Thread',)使用元组形式,后面需要,号。

2. 通过信号和槽机制传递参数
如果参数是在线程运行时动态变化的,可以使用信号和槽机制来传递参数。这种方式通常用于在主线程和工作线程之间传递数据。

在这里插入图片描述
2. 通过信号和槽机制传递参数
如果参数是在线程运行时动态变化的,可以使用信号和槽机制来传递参数。这种方式通常用于在主线程和工作线程之间传递数据。

class WorkerThread(QThread):data_available = pyqtSignal(str)def run(self):# ... 其他初始化代码self.data_available.connect(self.some_function)def some_function(self, text):# 使用传入的参数进行处理processed_text = text.upper()# ... 发送结果等操作

在主线程中,可以这样连接信号并发送参数:

thread = WorkerThread()
thread.data_available.connect(on_data_available)  # 连接到主线程的槽函数
thread.start()
# 发送数据到工作线程
thread.data_available.emit("Hello, World!")

3. 通过重写run方法传递参数
如果需要在run方法中根据不同的参数执行不同的任务,可以重写run方法,并将参数作为参数传递进去。

class WorkerThread(QThread):def __init__(self, text, parent=None):super(WorkerThread, self).__init__(parent)self.text = textdef run(self):# 根据不同参数执行不同的任务if self.text == "task1":self.task1()elif self.text == "task2":self.task2()# ... 其他任务def task1(self):# task1的处理逻辑passdef task2(self):# task2的处理逻辑pass

在创建并启动线程时,可以指定不同的参数:

thread = WorkerThread("task1")
thread.start()

以上就是几种在PyQt中将参数传递给QThread子类内部定义的函数的方法。你可以根据你的具体需求来选择最适合的一种。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/12414.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(四)Spring教程——控制反转或依赖注入与Java的反射技术

IoC的底层实现技术是反射技术,目前Java、C#、PHP 等语言均支持反射技术。 在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法;对任意一个对象,都能够调用它的任意方法和属性(包括私有的方法…

python的标准数据类型

四、标准数据类型 1、为什么编程语言中要有类型 类型有以下几个重要角色: 对机器而言,类型描述了内存中的电荷是怎么解释的。 对编译器或者解释器而言,类型可以协助确保上面那些电荷、字节在程序的运行中始终如一地被理解。 对程序员而言…

基于大模型训练的数字识别

创作原因 现在写电赛题,题目有识别数字的要求。但使用设备openmv使用模板匹配的算法帧率很低,且识别效果不是很好,于是我们就想到了利用神经网络训练模型来识别数字 正文部分 内容介绍 本文内容是基于openmv使用Edge Impulse训练大模型。…

服务攻防——应用协议ssh,rsync,proftpd,openssh,libssh

1.口令猜解 ftp-拿来文件传输的 rdp-windows远程连接 3389 ssh-linux远程连接 工具hydra 口令 1.windows 这就爆破成功了,现在,我们就可以ftp爆破,爆破出ftp的密码 爆破出来后 访问 2.ssh Rsync(配置不当,未授权…

Gooxi发布最新AI服务器:加速生成式AI落地 更懂AI

近日,Gooxi发布最新训推一体AI服务器,以大容量内存和灵活的高速互连选项满足各种AI应用场景,最大可能支持扩展插槽,从而大幅提升智能算力性能,以最优的性能和成本为企业的模型训练推理落地应用提供更好的通用算力。 AI…

主从Reactor服务器

目录: 目录: 目标: 本文讲解思路: 各模块的功能以及代码: 1.服务器相关模块:服务器模块的功能是对所有的连接以及线程进⾏管理 2.协议相关模块:协议模块是对当前的Reactor模型服务器提供应…

【HarmonyOS】Stage 模型 - 应用配置文件

如图所示: Stage 模型应用配置文件主要有两类: 全局配置文件。放在 AppScope 目录下,app.json5。用来配置应用全局的信息。模块配置文件,放在每个模块里,module.json5。用来配置模块的信息。 一、全局配置文件 示…

LeetCode1657确定两个字符串是否接近

题目描述 如果可以使用以下操作从一个字符串得到另一个字符串,则认为两个字符串 接近 : 操作 1:交换任意两个 现有 字符。例如,abcde -> aecdb操作 2:将一个 现有 字符的每次出现转换为另一个 现有 字符&#xff0…

【数据可视化01】matplotlib实例3之数据统计

目录 一、引言二、实例介绍1.百分位数为横条形图2.箱线图定制化3.带有自定义填充颜色的箱线图4.箱线图5.箱线图和小提琴图6.二维数据集的置信椭圆 一、引言 matplotlib库 可以用来创建各种静态、动态、交互式的图形,并广泛应用于数据分析和数据可视化领域。 二、实…

贷款中介CRM管理系统解决方案

一、贷款中介行业背景介绍 随着贷款中介行业的快速发展,贷款中介业务逐渐成为企业和个人融资的重要渠道。然而,贷款中介行业存在信息不对称、风险控制不力等难题。给金融稳定带来潜在风险。 二、方案目的和意义 鑫鹿贷款中介系统解决方案旨在规范贷款中…

Elasticsearch查看集群信息,设置ES密码,Kibana部署

Elasticsearch查看集群信息,设置ES密码,Kibana部署 查看集群信息查看节点信息查看集群健康状态查看分片信息查看其他集群信息 Kibana部署安装设置ES密码 查看集群信息 查看节点信息 curl http://127.0.0.1:9200/_cat/nodes?v 参数说明: ip…

研究生学习---找工作

规划 研一~研二上学期完成小论文,实习,秋招 竞赛:kaggle? 面试题一般简单且为原题,笔试题目很难,不会出原题 项目 找工作软件

SwiftUI中三大渐变色的介绍

在SwiftUI中,渐变色是一种常用的视觉效果,用于创建平滑过渡的颜色变化。通过使用渐变色,我们可以实现丰富多彩的界面设计,增强用户体验。 1. 渐变色的种类和用途 种类: 线性渐变(Linear Gradient&#x…

【时隙ALOHA,CSMA(载波侦听多路访问)carrier sense mltiple access,无线局域网: CSMA/CA】

文章目录 时隙ALOHA时隙ALOHA的效率( Efficiency )纯ALOHA(非时隙)----效率低CSMA(载波侦听多路访问)carrier sense mltiple accessCSMA冲突CSMA/CD(冲突检测)边说边听(提高了信道利用率)以太网就是用的这个无线局域网: CSMA/CA无线局域网中的 MAC&#…

Transformer+Classification学习笔记

论文名称:An Image is Worth 16x16 Words:Transformers for Image Recognition at Scale [2112.11010] MPViT: Multi-Path Vision Transformer for Dense Prediction (arxiv.org) 参考博客与视频: Vision Transformer 超详细解读 (原理分析代码解读) …

2024年了,Covid19怎么发?PANoptosis程序性死亡,抓紧上车!

说在前面 大家众所周知的新冠,其实早在19年末,20年初的时候很多人都抓住了这个热点发到了好文章,Covid-19,这玩意可以做到让一个期刊从2分飙升到20分,且非预警期刊,不过现在退火了,今年是12.7分…

数据结构(十四)----排序算法(1)

目录 一.排序的基本概念 二.插入排序 1.直接插入排序 2.折半插入排序 三.希尔排序(Shell Sort) 四.交换排序 1.冒泡排序 2.快速排序 快速排序算法的效率: 快速排序算法的稳定性: 这一篇博客的重点主要是快速排序&#x…

2024小红书电商实战营,养号打造IP/选爆品/开店铺/爆款笔记/等等(24节)

我们非常荣幸地为大家带来2024小红书电商实战营的第一期,在这里我们将带领大家一起深入学习如何利用小红书平台,实现个人品牌的发展和商业利益的增长。 首先,我们将讨论养号的重要性以及如何打造个人品牌。无论是建立自己的受众群体还是提高…

微信小程序知识点归纳(一)

前言:适用于有一定基础的前端开发同学,完成从网页开发到小程序开发的知识转换。 先立框架,后砌墙壁 回顾:了解微信小程序开发流程-CSDN博客 初始页面结构,三部分pages、utils、配置,分别存放页面、工具类…

【解决】Unity Build 应用程序运行即崩溃问题

开发平台:Unity 2021.3.7f1c1   一、问题描述 编辑器 Build 工程结束,但控制台 未显示 Build completed with a result of Succeeded [时间长度] 信息。该情况下打包流程正常,但应用程序包打开即崩溃。   二、问题测试记录 测试1&#xf…