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

相关文章

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,导致链接无法访问

STM32 ADC+DMA导致写FLASH失败

最近用STM32G070系列的ADC+DMA采样时,遇到了一些小坑记录一下; 一、ADC+DMA采样时进入死循环; 解决方法:ADC-dma死循环问题_stm32 adc dma死机-CSDN博客 将ADC的DMA中断调整为最高,且增大ADCHAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, ADC_Buffer_Size); 的ADC_Bu

DAY16:什么是慢查询,导致的原因,优化方法 | undo log、redo log、binlog的用处 | MySQL有哪些锁

目录 什么是慢查询,导致的原因,优化方法 undo log、redo log、binlog的用处  MySQL有哪些锁   什么是慢查询,导致的原因,优化方法 数据库查询的执行时间超过指定的超时时间时,就被称为慢查询。 导致的原因: 查询语句比较复杂:查询涉及多个表,包含复杂的连接和子查询,可能导致执行时间较长。查询数据量大:当查询的数据量庞大时,即使查询本身并不复杂,也可能导致

一款支持同一个屏幕界面同时播放多个视频的视频播放软件

GridPlayer 是一款基于 VLC 的免费开源跨平台多视频同步播放工具,支持在一块屏幕上同时播放多个视频。其主要功能包括: 多视频播放:用户可以在一个窗口中同时播放任意数量的视频,数量仅受硬件性能限制。支持多种格式和流媒体:GridPlayer 支持所有由 VLC 支持的视频格式以及流媒体 URL(如 m3u8 链接)。自定义网格布局:用户可以配置播放器的网格布局,以适应不同的观看需求。硬

71-java 导致线程上下文切换的原因

Java中导致线程上下文切换的原因通常包括: 线程时间片用完:当前线程的时间片用完,操作系统将其暂停,并切换到另一个线程。 线程被优先级更高的线程抢占:操作系统根据线程优先级决定运行哪个线程。 线程进入等待状态:如线程执行了sleep(),wait(),join()等操作,使线程进入等待状态或阻塞状态,释放CPU。 线程占用CPU时间过长:如果线程执行了大量的I/O操作,而不是CPU计算

centOS7.0设置默认进入字符界面

刚装的,带有x window桌面,每次都是进的桌面,想改成自动进命令行的。记得以前是修改 /etc/inittab 但是这个版本inittab里的内容不一样了没有id:x:initdefault这一行而且我手动加上也不管用,这个centos 7下 /etc/inittab 的内容 Targets systemd uses targets which serve a simil

一次生产环境大量CLOSE_WAIT导致服务无法访问的定位过程

1.症状 生产环境的一个服务突然无法访问,服务的交互过程如下所示: 所有的请求都是通过网关进入,之后分发到后端服务。 现在的情况是用户服务无法访问商旅服务,网关有大量java.net.SocketTimeoutException: Read timed out报错日志,商旅服务也不断有日志打印,大多是回调和定时任务日志,所以故障点在网关和商旅服务,大概率是商旅服务无法访问导致网关超时。 后