如何解决QTableModel有新增行的时候不能准确删除所有行的问题

       QTableModel是我们使用Python进行数据库开发时经常用到的,但在QTableModel中添加了新行,不保存的时候,进行删除所有行的操作,经常会出现部分行实行上没有删除的情况。

        通过QTableView展示QTableModel的数据,通过序号列可以识别行的状态,数字是原有的行,*是新添加的行,!是准备删除的行。当执行submitAll()时,才更新后台数据库的数据。

       删除所有行,我们一般使用如下的代码:

for row in range(0, Model.rowCount()):
    Model.removeRow(row)

        如果没有新增的行,上述代码运行正常,但如果数据中有新增的行,就会出现没有真正删除所有行的情况。经过仔细的排查,原来是因为对原有行、新增行的删除方式不一样。对原有行,不会真正删除,只会将编号改为“!”;但对新增行,会直接删除,如果还是按行号逐一执行removeRow(),就会出现删一行、跳过一行的情况。

       为了防止出现这种情况,删除QTableModel所有行的时候,就要根据是否为新增行,来确定需要删除的行号,这样就能避免出现有新增行的情况下,没有真实删除所有行的情况。具体代码如下:

i = 0  # 控制循环次数
k = 0  # 控制删除的行号
k1 = self.px_Model.rowCount()  # 记录总数会随着删除操作变化,要先记录在变量中
while i < k1:
    self.ui.my_View.selectRow(k)  # 选中行
    self.ui.my_View.hideRow(k)  # 可以隐藏删除的行,让显示同步
    if self.my_Model.headerData(self.ui.my_View.currentIndex().row(), QtCore.Qt.Orientation.Vertical, Qt.ItemDataRole.DisplayRole) != "*":
        k += 1  # 如果不是新增行,行号就+1
    self.my_Model.removeRow(self.ui.my_View.currentIndex().row()) 
    i += 1  # 循环次数+1

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值