PyQt QThread 简单代码

问题

每次运行到耗时方法时界面就卡死,无响应,花费了很长事件才把问题解决了,记录一下

原因分析

程序在主线程中执行,当主程序中有一个事件比较耗时时,主程序就会等耗时事件处理完才会进行下一步,此时界面就会卡死出现无响应的状态

解决办法

  • 使用多线程
    • 主线程只执行界面显示
    • 子线程中执行耗时任务

简单Qthread实现       

        当使用PyQt编写GUI应用程序时,可以使用QThread类来执行耗时的任务,以避免主线程阻塞和页面无响应的问题。下面是一个简单的完整可运行代码示例,演示了如何在PyQt中使用QThread。

import sys
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton# 自定义的工作线程类
class WorkerThread(QThread):# 定义一个信号,用于在工作完成后发送通知finished = pyqtSignal()def run(self):# 执行耗时的任务self.do_work()# 发送工作完成的信号self.finished.emit()def do_work(self):# 模拟耗时的任务import timetime.sleep(5)# 主窗口类
class MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("QThread示例")self.setGeometry(100, 100, 300, 200)self.label = QLabel("等待工作完成...", self)self.label.setGeometry(50, 50, 200, 30)self.start_button = QPushButton("开始", self)self.start_button.setGeometry(100, 100, 100, 30)self.start_button.clicked.connect(self.start_work)self.worker_thread = WorkerThread()self.worker_thread.finished.connect(self.on_worker_finished)def start_work(self):# 启动工作线程self.worker_thread.start()def on_worker_finished(self):# 工作完成后更新标签文字self.label.setText("工作完成!")if __name__ == "__main__":app = QApplication(sys.argv)window = MainWindow()window.show()sys.exit(app.exec_())

        在这个示例中,我们创建了一个自定义的工作线程类WorkerThread,继承自QThread。在WorkerThread中,我们重写了run方法,该方法会在线程启动时自动调用。在run方法中,我们执行了一个模拟的耗时任务do_work,在任务完成后发送了一个自定义的信号finished

        在主窗口类MainWindow中,我们创建了一个QLabel控件用于显示文字。在窗口初始化时,我们创建了一个WorkerThread实例,并将其finished信号连接到槽函数on_worker_finished。然后,我们调用start_work方法启动工作线程。

        当工作线程完成任务时,会发出finished信号,触发槽函数on_worker_finished。在槽函数中,我们更新了标签控件的文字,将其设置为"工作完成!"。(只有在工作线程发射finished信号后,槽函数self.on_worker_finished才会被调用。)

        通过使用QThread,耗时的任务在工作线程中执行,不会阻塞主线程,从而避免了页面无响应的问题。同时,通过使用信号和槽机制,我们可以在工作完成后更新UI控件的状态。

总结思路:

通过点击按钮触发启动工作线程,线程的run()方法完成耗时任务,完成后发送完成信号后便可触发控件显示文字。

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

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

相关文章

Verilog 字符串

文章目录 字符串简介字符串声明字符串操作输出字符画 字符串简介 一个字符串是由双引号"括起来并包含在一行中的字符序列。 在表达式和赋值语句中,用作操作数的字符串被视为由8bit ASCII码值表示的无符号整数常量。 字符串声明 字符串变量是wire/reg类型的变…

部署LVS的NAT模式

实验准备 #负载调度器# 192.168.116.40 #内网 12.0.0.100 #外网 先添加双网卡 #web服务器# 192.168.116.20 #web1 192.168.116.30 #web2 #nfs共享服务# 192.168.116.10 #nfs systemctl stop firewalld setenforce 0 1.nfs共享文件 1…

gitee(ssh)同步本地

一、什么是码云 gitee Git的”廉价平替” > 服务器在国内,运行不费劲 在国内也形成了一定的规模 git上的一些项目插件等在码云上也可以找得到 二、创建仓库 三、删除仓库 四、仓库与本地同步 > 建立公钥 五、把仓库同步到本地 六、在本地仓库中创建vue项目…

C++设计模式之——命令模式

命令模式 概念创建步骤示例示例一代码实现运行结果 示例二代码实现运行结果 示例三示例代码运行结果 示例四代码实现运行结果 应用场景 概念 命令模式是一种行为型设计模式,它允许将请求封装为一个对象,从而使得可以参数化客户端请求、将请求排队或者记…

docker干净编译环境搭建

docker干净编译环境搭建 一、docker安装1、环境2、安装 二、编译环境三、Dockerfile环境1、安装基本环境版本:2、在有镜像zyhdell/ubuntu:v1下的创建: 四、创建work容器: 一、docker安装 1、环境 操作系统版本:ubuntu 22.04.3 de…

libp2p 快速开始

文章目录 第一部分:libp2p 快速入门一、什么是libp2plibp2p 发展历程libp2p的特性p2p 网络和我们熟悉的 client/server 网络的区别: 二、Libp2p的实现目标三、Libp2p的用途四、运行 Libp2p 协议流程libp2p 分为三层libp2p 还有一个局域网节点发现协议 mD…

原生JS实现组件切换(不刷新页面)

这是通过原生Es6实现的组件切换,代码很简单,原理和各种框架原理大致相同。 创建文件 ├── component:存放组件 │ ├── home1.js:组件1 │ ├── home2.js:组件2 ├── index.html ├── index.js初始化ht…

LLaMA系列模型

1.LLama 1.1 简介 Open and Efficient Foundation Language Models (Open但没完全Open的LLaMA) 2023年2月,Meta(原Facebook)推出了LLaMA大模型,使用了1.4T token进行训练,虽然最大模型只有65B,但在相关评…

[23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians

[paper | proj] 给定FLAME,基于每个三角面片中心初始化一个3D Gaussian(3DGS);当FLAME mesh被驱动时,3DGS根据它的父亲三角面片,做平移、旋转和缩放变化;3DGS可以视作mesh上的辐射场&#xff1…

「Vue3面试系列」Vue3.0的设计目标是什么?做了哪些优化?

文章目录 一、设计目标1.1 更小1.2 更快1.3更友好 二、优化方案2.1 源码2.11源码管理2.22 TypeScript 2.2 性能2.3 语法 API2.31逻辑组织2.32 逻辑复用 参考文献 一、设计目标 不以解决实际业务痛点的更新都是耍流氓,下面我们来列举一下Vue3之前我们或许会面临的问…

校园转转二手市场源码+Java二手交易市场整站源码

源码介绍 校园转转二手市场源码分享,Java写的应用,mybatis-plus 和 Hibernate随心用 后台地址:/home/index/index 账号密码:admin/123456 前台地址:/system/login

Java小技巧:创建带缓存的过程

在平常开发中,我们经常遇到这样一类过程:有一定计算量,被频繁调用,但对于任意一个参数,结果是恒定的(换句话说,就是纯函数),为了减少频繁调用的性能开销,我们…

计算机网络2

OSI参考模型七层: 1.应用层 2.表示层 3.会话层 4.传输层 5.网络层 6.数据链路层 7.物理层 TCP/IP模型 5层参考模型

Apipost检测接口工具的基本使用方法

👀 今天言简意赅的介绍一款和postman一样好用的后端接口测试工具Apipost 专门用于测试后端接口的工具,可以生成接口使用文档官方下载网站:http://www.apipost.cn 傻瓜式安装—>register->项目->创建项目->APIs->新建目录&…

Flink 数据类型 TypeInformation信息

Flink流应用程序处理的是以数据对象表示的事件流。所以在Flink内部,我么需要能够处理这些对象。它们需要被序列化和反序列化,以便通过网络传送它们;或者从状态后端、检查点和保存点读取它们。为了有效地做到这一点,Flink需要明确知…

【大麦小米学量化】使用xtquant调用迅投MiniQMT客户端定时操作逆回购,再也不担心忘了赚零花钱了(含完整源代码)

文章目录 前言一、逆回购是什么?1. 什么是逆回购?2. 最低参与金额是多少?3. 逆回购交易是否安全?4. 逆回购交易适合什么类型的客户? 二、讯投XtQuant是什么?1. XtQuant运行依赖环境2. XtQuant运行逻辑 三、…

Linux Docker本地部署WBO在线协作白板结合内网穿透远程访问

文章目录 前言1. 部署WBO白板2. 本地访问WBO白板3. Linux 安装cpolar4. 配置WBO公网访问地址5. 公网远程访问WBO白板6. 固定WBO白板公网地址 前言 WBO在线协作白板是一个自由和开源的在线协作白板,允许多个用户同时在一个虚拟的大型白板上画图。该白板对所有线上用…

LeetCode刷题--- 全排列 II

个人主页:元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 http://t.csdnimg.cn/6AbpV 数据结构与算法 http://t.csdnimg.cn/hKh2l 前言:这个专栏主要讲述递归递归、搜…

搭建git服务器(本地局域网)

搭建git服务器(本地局域网) 创建仓库 (假定在/home/git目录下创建仓库) git init --bare sample.git克隆远程仓库到本地 git clone git192.168.0.100:/home/git/sample.git已有项目,绑定远程仓库 # 查看远程仓库绑定 git remote -v# 解除…

拼多多ID取商品详情API:电商行业的核心价值与实时数据获取策略

一、引言 在当今的电商行业中,数据是驱动业务决策和优化用户体验的关键因素。拼多多作为中国电商市场的主要参与者,其根据ID取商品详情原数据的API在电商行业中具有显著的重要性。本文将深入探讨这个话题,并介绍如何实现实时数据获取。 二、…