Pyside6:setCellWidget导致界面莫名卡死

2023-11-03 23:52

本文主要是介绍Pyside6:setCellWidget导致界面莫名卡死,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在Pyside6使用过程中,如果使用到了QTableWidget中的setCellWidget方法进行添加表格中添加按钮或其他控件的操作时,正常情况下是没有任何问题的,但在特定情况下发生了奇怪的、莫名的程序卡死,这个可能的情况如下:

  1.  子进程管道发送数据回主进程
  2. 主进程通过单例发送了一个通知给QTableWidget控件
  3. QTableWidget控件进行clear()方法,清空
  4. QTableWidget重新赋值行数,并在循环中使用setCellWidget进行按钮添加

程序卡死发生时,并没有出现任何报错,且通过cellWidget()获取widget时亦为None。

如果你也遇到了以上的情况,请按本文内容进行解决。

一、发生问题的伪代码

self.ui.table_widget.clear()
self.ui.table_widget.setHorizontalHeaderLabels(['标题', '姓名', '操作'])
self.ui.table_widget.setRowCount(3)for i in range(3):data = data_list[i]item = QTableWidgetItem(data.get('title'))self.ui.table_widget.setItem(i, 1, item)item = QTableWidgetItem(data.get('name'))self.ui.table_widget.setItem(i, 2, item)self.ui.table_widget.setCellWidget(i, 3, QPushButton('编辑'))

二、解决方案

如果发生上面的问题,解决方案即是当QTableWidget的每一行创建后就不要进行clear()操作,然后当更新数据时,仅通过setRowCount()的行数,然后把以前的item进行复用即可:

self.ui.table_widget.setHorizontalHeaderLabels(['标题', '姓名', '操作'])
self.ui.table_widget.setRowCount(3)for i in range(3):data = data_list[i]if self.ui.table_widget.item(i, 0) is None:item = QTableWidgetItem(data.get('title'))self.ui.table_widget.setItem(i, 0, item)else:item = self.ui.table_widget.item(i, 0)item.setText(data.get('title'))if self.ui.table_widget.item(i, 1) is None:item = QTableWidgetItem(data.get('name'))self.ui.table_widget.setItem(i, 1, item)else:item = self.ui.table_widget.item(i, 1)item.setText(data.get('name'))if self.ui.table_widget.cellWidget(i, 3) is None:self.ui.table_widget.setCellWidget(i, 3, QPushButton('编辑'))

三、总结

虽然复用控件会造成一定的内存消耗,但可以避免很多不明确的问题发生,所以明确什么时候复用什么时候保活,不然会出现奇怪的问题。

这篇关于Pyside6:setCellWidget导致界面莫名卡死的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/341759

相关文章

CSS3打造的现代交互式登录界面详细实现过程

《CSS3打造的现代交互式登录界面详细实现过程》本文介绍CSS3和jQuery在登录界面设计中的应用,涵盖动画、选择器、自定义字体及盒模型技术,提升界面美观与交互性,同时优化性能和可访问性,感兴趣的朋... 目录1. css3用户登录界面设计概述1.1 用户界面设计的重要性1.2 CSS3的新特性与优势1.

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

PyQt6/PySide6中QTableView类的实现

《PyQt6/PySide6中QTableView类的实现》本文主要介绍了PyQt6/PySide6中QTableView类的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学... 目录1. 基本概念2. 创建 QTableView 实例3. QTableView 的常用属性和方法

PyQt6/PySide6中QTreeView类的实现

《PyQt6/PySide6中QTreeView类的实现》QTreeView是PyQt6或PySide6库中用于显示分层数据的控件,本文主要介绍了PyQt6/PySide6中QTreeView类的实现... 目录1. 基本概念2. 创建 QTreeView 实例3. QTreeView 的常用属性和方法属性

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

Python中的可视化设计与UI界面实现

《Python中的可视化设计与UI界面实现》本文介绍了如何使用Python创建用户界面(UI),包括使用Tkinter、PyQt、Kivy等库进行基本窗口、动态图表和动画效果的实现,通过示例代码,展示... 目录从像素到界面:python带你玩转UI设计示例:使用Tkinter创建一个简单的窗口绘图魔法:用

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问