Qtablewidget 删除行问题

Qtablewidget Deleting row issue

这里需要一些专家建议。

我正在使用 PyQT5 和 Python 3 来设置 UI。我用 Qtablwiwdget 创建了一个 table 并且我能够获得大部分控件。但是,我陷入了删除操作。我创建了一个 Delete 按钮,用于删除所选行。我可以通过将 currentrow 值传递给 removerow 函数来实现这一点。

现在的问题是,每次删除后,currentrow 计数都会减少 1,因此如果我多次单击删除按钮,所选行上方的行将被删除,而不是下方的行。

这是我的代码:

        self.DataTable = QTableWidget(self)
        self.DataTable.setColumnCount(3)
        self.DataTable.setRowCount(1)
        self.DataTable.setHorizontalHeaderLabels(["Name","Age","Location"])
        self.DataTable.horizontalHeaderItem(0).setTextAlignment(Qt.AlignHCenter)
        self.DataTable.horizontalHeaderItem(1).setTextAlignment(Qt.AlignHCenter)
        self.DataTable.horizontalHeaderItem(2).setTextAlignment(Qt.AlignHCenter)
        self.DataTable.resize(450, 400)

        self.Delete_butn.clicked.connect(self.On_Delete_Click) # button click

#插槽

@pyqtSlot()
    def On_Delete_Click(self):
        SelectedRow = self.DataTable.currentRow()
        rowcount = self.DataTable.rowCount()

        if rowcount==0:  # gives a pop up when now more rows are there to delete
            msg = QMessageBox(self)
            msg.setIcon(QMessageBox.Warning)
            msg.setText("NOTE:")
            msg.setInformativeText("\n No more rows to delete! \t\t")
            msg.setWindowTitle("WARNING!")
            # msg.setDetailedText("The details are as follows:")
            msg.setStandardButtons(QMessageBox.Ok)
            msg.buttonClicked.connect(self.msgbtn)
            retval = msg.exec_()



        elif SelectedRow==-1: # Gives pop up when no rows are selected

            msg = QMessageBox(self)
            msg.setIcon(QMessageBox.Warning)
            msg.setText("NOTE:")
            msg.setInformativeText("\n Please select the row to be deleted! \t\t")
            msg.setWindowTitle("WARNING!")
            # msg.setDetailedText("The details are as follows:")
            msg.setStandardButtons(QMessageBox.Ok)
            msg.buttonClicked.connect(self.msgbtn)
            retval = msg.exec_()


        else:
            self.DataTable.removeRow(SelectedRow)

我想要实现的是,如果我有 8 行(从 0-7)具有正确的值并且在第 3-6 行具有错误的值,我将首先单击第 3 行,然后单击删除。删除时,行向上移动,我应该再次删除第 3 行。但它没有发生。第一次删除操作后,当前行从 3 减少到 2,结果丢失了错误值单元格顶部的值

问题是currentIndex()关联的行在删除与currentRow()相同的行后减1,所以解决方法是在删除行后建立currentIndex相同的位置:

# ...
else:        
    self.DataTable.removeRow(SelectedRow)
    <b>ix = self.DataTable.model().index(
        SelectedRow, self.DataTable.currentColumn()
    )
    self.DataTable.setCurrentIndex(ix)</b>
# ...

在遇到 selectrows 函数后,我的问题得到了一个简单的修复。用下面的替换我的其他条件

    SelectedRow = self.DataTable.currentRow()
    self.DataTable.removeRow(SelectedRow)
    self.DataTable.selectRow(SelectedRow)

self.DataTable.selectRow 使 SelectedRow 值相同,直到通过鼠标单击选择新行