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)
所以我创建了一个 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)