Python PyQt - 删除选定的表行,如果未选择行,则删除错误的行



所以我用PyQT5创建了一个CSV数据库。用户可以选择删除最后一行并选择行

因此,我在选择和删除所选行时遇到问题:(如果我的问题很难理解,我很抱歉,我不知道如何正确解释,所以这里有一个小的视觉表示(

1.data1                                                1.data1  
2.data2   -> user selects 2.data2 row and deletes it-> 2.data3   
3.data3                                                3.data4
4.data4
-> but if the user decides to delete last row without selecting the row this is what happens
1.data1                                                                      1.data1
2.data3                                                                      2.data4
3.data4  -> user presses Delete row button, without selecting 3.data4 row ->
-> but the last row doesn't get deleted instead the index of previously selected row gets passed 
and the last selected row gets deleted

我已经设法在这段代码中找到了这个问题,我猜这个问题来自.currentIndex((,但我不知道如何将currentIndex设置为None或空,这样它就不会携带数字。

def deleteSelectedRow(self):
self.chosenRow = self.table_Database.currentIndex().row()
print(self.chosenRow)
if self.chosenRow < 0:
return
else:
self.table_Database.removeRow(self.chosenRow)

我曾尝试将其设置为负数,但这造成了相同的效果,所选行的索引占了相同的

项视图的currentIndex()不指示所选索引:虽然通常使用setCurrentIndex()选择该索引,但即使未选择任何索引,也可以有当前索引。

当从视图中删除当前索引时,Qt会根据删除的内容自动将新的当前索引设置(但不选择!(到前一行和/或列,除非没有可用索引(rowCount()columnCount()返回0(删除的索引在第一行或列中(在这种情况下,它会设置第一个可用行和/列(。

简单的解决方案是检查是否有选择的索引:

def deleteSelectedRow(self):
if self.table_Database.selectedIndexes():
row = self.table_Database.currentIndex().row()
else:
row = self.table_Database.rowCount() - 1
if row >= 0:
self.table_Database.removeRow(row)

考虑到上面所解释的,你也可以有扩展的选择,它不显示";当前索引";是如果支持对多行进行选择,则应根据所选索引创建一个行列表,并按反向顺序删除行:

def deleteSelectedRow(self):
selected = self.table_Database.selectedIndexes()
if selected:
# create a set of *unique* rows
rows = set(i.row() for i in selected)
else:
rows = [self.table_Database.rowCount() - 1]
for row in sorted(rows,reverse=True):
self.table_Database.removeRow(row)

最新更新