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

Python PyQt - deleting selected table rows, and deletes wrong rows if row isn't selected

所以我创建了一个 CSV 数据库 PyQT5.The 用户可以选择删除最后一行和选定的行

所以我在选择和删除所选行时遇到了问题: (如果我的问题难以理解,我深表歉意,我不知道如何正确解释,所以这里有一个小的可视化表示)

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() 不表示 selected 索引:虽然通常使用 setCurrentIndex()selects 索引,即使 none 是 selected.

也可以有当前索引

当当前的索引从视图中删除时,Qt 会自动设置(但 而不是 select!)新的当前索引到上一行 and/or列取决于被删除的内容,除非没有可用的索引(rowCount()columnCount()return0)被删除的索引位于第一行或第一列(在本例中,它设置第一个可用行 and/or 列)。

简单的解决方案是检查是否有 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)

考虑到上面的解释,您还可以扩展 selections,它不显示“当前索引”是什么;如果你在多行上支持 selections,你应该根据 selected 索引创建一个行列表,并删除 reversed 中的行顺序:

    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, <b>reverse=True</b>):
            self.table_Database.removeRow(row)