当前位置: 首页 > news >正文

pyqt---子线程进行gui操作导致界面崩溃

在 PyQt(或 Qt 通常)中,您不能直接在子线程中执行与 GUI 相关的操作。这可能会导致应用程序崩溃或不可预测的行为。所有与 GUI 相关的操作都应该在主线程中执行。

如果您需要在子线程完成某些操作后显示一个消息框,可以使用 PyQt 提供的信号和槽机制来在主线程中执行 GUI 更新。以下是如何实现这个机制的示例:

1. 在您的线程类中定义一个信号。

from PyQt5.QtCore import pyqtSignal, QThreadclass YourThread(QThread):show_warning_signal = pyqtSignal(str, str, str)def run(self):# ... 执行其他线程操作 ...# 当您需要显示消息框时,发出信号,而不是直接显示消息框kind = "0"name = "1"tunnel = "2"self.show_warning_signal.emit(kind, name, tunnel)

2. 在您的主窗口或相应的类中,将该信号连接到一个槽函数。

class YourMainWindow(QWidget):def __init__(self):super().__init__()self.thread = YourThread()self.thread.show_warning_signal.connect(self.display_warning)def display_warning(self, kind, name, tunnel):msg_box = QMessageBox()msg_box.setIcon(QMessageBox.Warning)msg_box.setWindowTitle("导入配置错误")msg_box.setText(f"导入文件-{kind}-<font color='red'><b>{name}</b></font>-通道-{tunnel}-不在当前读取通道中")msg_box.exec()

通过上述方法,您可以确保消息框的显示是在主线程中完成的,从而避免了由于直接在子线程中进行 GUI 操作而导致的崩溃。

另一种创建线程方法的使用方式

如果您使用 Python 的内置 `threading` 模块来创建线程,而不是使用 PyQt 的 `QThread`,您仍然必须确保 GUI 相关的操作(例如显示消息框)仅在主线程中执行。在 PyQt 中,直接从非主线程修改 GUI 是不安全的。

即使您使用 `threading.Thread`,仍可以使用 PyQt 的信号和槽机制来安全地更新 GUI。以下是如何实现这种机制的步骤:

1. 定义一个信号:

from PyQt5.QtCore import pyqtSignal, QObjectclass GUIUpdater(QObject):show_warning_signal = pyqtSignal(str, str, str)

2. 在您的主窗口或相应的类中,将该信号连接到一个槽函数:

class YourMainWindow(QWidget):def __init__(self):super().__init__()self.gui_updater = GUIUpdater()self.gui_updater.show_warning_signal.connect(self.display_warning)self.thread_Data_reception = threading.Thread(target=self.Data_reception)self.thread_Data_reception.start()def Data_reception(self):# ... 执行其他线程操作 ...# 当您需要显示消息框时,发出信号,而不是直接显示消息框kind = "0"name = "1"tunnel = "2"self.gui_updater.show_warning_signal.emit(kind, name, tunnel)def display_warning(self, kind, name, tunnel):msg_box = QMessageBox()msg_box.setIcon(QMessageBox.Warning)msg_box.setWindowTitle("导入配置错误")msg_box.setText(f"导入文件-{kind}-<font color='red'><b>{name}</b></font>-通道-{tunnel}-不在当前读取通道中")msg_box.exec()

这种方法的关键是使用 `pyqtSignal` 来安全地跨线程通信,并确保 GUI 更新始终在主线程中执行。

相关文章:

pyqt---子线程进行gui操作导致界面崩溃

在 PyQt&#xff08;或 Qt 通常&#xff09;中&#xff0c;您不能直接在子线程中执行与 GUI 相关的操作。这可能会导致应用程序崩溃或不可预测的行为。所有与 GUI 相关的操作都应该在主线程中执行。 如果您需要在子线程完成某些操作后显示一个消息框&#xff0c;可以使用 PyQt…...

vue-cli 输出的模板 html 文件使用条件语句

背景 项目使用的是 vue-cli 脚手架&#xff0c;需要根据不同环境的配置&#xff0c;在输出的 html 模板中使用条件语句来生成不同的代码。 环境变量 在 .env.development 中&#xff0c;定义环境变量 VUE_APP_DISABLE_IP_ACCESStrue使用条件语句 第一种方法&#xff0c;使…...

Spring Boot集成kafka的相关配置

引入依赖&#xff1a; 额外依赖只需要这一个&#xff0c;kafka-client 不是springboot 的东西&#xff0c;那是原生的 kafka 客户端&#xff0c; kafka-test也不需要&#xff0c;是用代码控制broker的东西。 <dependency><groupId>org.springframework.kafka</g…...

Git(11)——Git相关问题解答以及常用命令总结

目录 一、简介 二、问题 三、常用命令总结 一、简介 本篇文章将介绍作者在学习Git的过程所遇到的困惑以及熟悉Git后总结的常用命令 二、问题 ①Git配置的邮箱和用户名和Git的ssh密钥有什么联系&#xff1f;假如我使用Gitlab在张三这个账户上配置了ssh公钥&#xff0c;但是…...

【LeetCode高频SQL50题-基础版】打卡第7天:第36~40题

文章目录 【LeetCode高频SQL50题-基础版】打卡第7天&#xff1a;第36~40题⛅前言按分类统计薪水&#x1f512;题目&#x1f511;题解 上级经理已离职的公司员工&#x1f512;题目&#x1f511;题解 换座位&#x1f512;题目&#x1f511;题解 电影评分&#x1f512;题目&#x…...

C++入门1

C入门1 1.前言2.命名空间1.C语言对于命名空间方面的缺陷2.命名空间的语法特性1.域作用限定符2.命名空间的可嵌套性 3.声明与定义分离的命名空间4.命名空间的展开5.多个命名空间中命名冲突6.对于命名空间的推荐写法 3.iostream1.cout和endl2.cin 3.缺省参数1.缺省参数的形式2.缺…...

Matlab论文插图绘制模板第118期—进阶气泡图

之前的文章中&#xff0c;分享过Matlab气泡图的绘制模板&#xff1a; 图虽说好看&#xff0c;但有一个缺点&#xff1a;需要手动调节两个图例的位置。 为了解决这一问题&#xff0c;我们不妨结合前段时间分享的紧凑排列多子图的绘制模板&#xff1a; 从而达到自动对齐排列的效…...

grafana接入OpenTSDB设置大盘语法

目录 1、filter过滤语法1.1 精准匹配1.2 正则匹配1.3 通配符匹配 完整示例1、 展示应用app的CPU利用率监控2&#xff09;展示应用app的在线核数 1、filter过滤语法 1.1 精准匹配 literal_or &#xff1a; tagv的过滤规则: 精确匹配多项迭代值&#xff0c;多项迭代值以’|分隔&a…...

HarmonyOS 远端状态订阅开发实例

IPC/RPC 提供对远端 Stub 对象状态的订阅机制&#xff0c; 在远端 Stub 对象消亡时&#xff0c;可触发消亡通知告诉本地 Proxy 对象。这种状态通知订阅需要调用特定接口完成&#xff0c;当不再需要订阅时也需要调用特定接口取消。使用这种订阅机制的用户&#xff0c;需要实现消…...

实战一:Http轮询弹幕拦截

系列文章目录 训练地址:https://www.qiulianmao.com websocket逆向http拦截websocket拦截视频号直播弹幕采集实战一:Http轮询更新中实战一:Http轮询 系列文章目录前言一、判断消息传输技术二、用户进入直播间三、 用户发言四、 用户送礼五、点赞事件六、用户唯一id的获取七…...

虚拟机独立 IP 配置

虚拟机独立 IP 配置 1. 点击虚拟网络编辑器 2. 点击更改设置 3. 查看本地电脑网卡型号并设置虚拟网络编辑器桥接网卡为同型号网卡 4. 设置有限网络信息 5. 点击网络编辑按钮并点击身份 6. 编辑名称并选择MAC地址 7. 配置 IPv4 地址后点击应用即可...

升级教育技术软件的多合一解决方案

当今时代技术和教育联系越来越紧密&#xff0c;教育机构对强大、安全、灵活的 IT 解决方案的探索至关重要。 全球事件、技术进步以及学生和教职员工不断变化的需求影响着不断变化的教育格局&#xff0c;我们要采取变革性的方法来确保教育的连续性和质量提升。 Splashtop Ente…...

c++视觉检测-----角点检测

角点检测&#xff1a;cornerHarris() cornerHarris()函数是OpenCV中用于执行Harris角点检测的函数。Harris角点检测是一种用于检测图像中角点的技术&#xff0c;通常用于特征检测和图像匹配。以下是cornerHarris()函数的用法&#xff1a; void cornerHarris(InputArray src, …...

虚拟机安装Docker

安装Docker Docker 分为 CE 和 EE 两大版本。CE 即社区版&#xff08;免费&#xff0c;支持周期 7 个月&#xff09;&#xff0c;EE 即企业版&#xff0c;强调安全&#xff0c;付费使用&#xff0c;支持周期 24 个月。 Docker CE 分为 stable test 和 nightly 三个更新频道。…...

虚幻引擎5:增强输入的使用方法

一、基本配置 1.创建一个输入映射上下文&#xff08;映射表&#xff09; 2.创建自己需要的操作映射或者轴映射 3.创建完成之后进入这个映射&#xff0c;来设置类型&#xff0c;共有4个类型 1.Digital:是旧版操作映射类型&#xff0c;一般是按下抬起来使用&#xff0c;像跳跃…...

buffer overflow detected

背景 在应用上云改造中&#xff0c;业务场景如下&#xff1a; 在使用ecs的场景中&#xff0c;应用的ip都是固定的&#xff1b;在使用k8s之后pod的ip就变的不固定了&#xff0c;k8s提供了statefulset的模式来支持这种场景&#xff0c;以固定域名的方式支持。 问题 在平台pod开…...

【c++源码】老飞飞源码完整v15源码(包含数据库前端后端源文件)

老飞飞源码完整v15源码&#xff08;包含数据库前端后端源文件&#xff09;程序来源于国外网站。程序仅供参考学习游戏开发流程。以及框架内容。 测试环境搭建 Visual Studio 2013 SQL Server 2008r Windows 10 和 11 专业版 这些文件已经过测试&#xff0c;搭建&#xff0c;运行…...

MySQL创建数据库、创建表操作和用户权限

1、创建数据库school&#xff0c;字符集为utf8 2、在school数据库中创建Student和Score表 3、授权用户tom&#xff0c;密码Mysql123&#xff0c;能够从任何地方登录并管理数据库school 4、使用mysql客户端登录服务器&#xff0c;重置root密码...

时间序列分析基础篇

**时间序列分析&#xff08;time series analysis&#xff09;是量化投资中的一门基本技术。时间序列是指在一定时间内按时间顺序测量的某个变量的取值序列。**比如变量是股票价格&#xff0c;那么它随时间的变化就是一个时间序列&#xff1b;同样的&#xff0c;如果变量是股票…...

Idea JavaWeb项目,继承自HttpFilter的过滤器,启动Tomcat时部署工件出错

JDK版本&#xff1a;1.8 Tomcat版本&#xff1a;8.5 10-Oct-2023 13:55:17.586 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal One or more Filters failed to start. Full details will be found in the appropriate conta…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...