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)删除的索引位于第一行或第一列(在这种情况下,它设置第一个可用行和/或列)。

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

    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)