本文主要是介绍Pyside6:setCellWidget导致界面莫名卡死,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在Pyside6使用过程中,如果使用到了QTableWidget中的setCellWidget方法进行添加表格中添加按钮或其他控件的操作时,正常情况下是没有任何问题的,但在特定情况下发生了奇怪的、莫名的程序卡死,这个可能的情况如下:
- 子进程管道发送数据回主进程
- 主进程通过单例发送了一个通知给QTableWidget控件
- QTableWidget控件进行clear()方法,清空
- 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导致界面莫名卡死的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!