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