Qtablewidget删除行问题

问题描述 投票:0回答:2

这里需要一些专家意见。

我正在使用PyQT5和Python 3来设置UI。我已经使用Qtablwiwdget创建了一个表,并且能够获得大多数控件。但是,卡在了删除操作中。我创建了一个Delete按钮,该按钮删除了选定的行。可以通过将currentrow值传递给removerow函数来实现此目的。

现在的问题是,每次删除后,当前行数都会减少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

#slot

@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行,然后单击Delete。删除时,该行向上移动,我应该再次删除第3行。但是它没有发生。第一次删除操作后,当前行从3减少到2,结果是丢失了错误赋值的单元格上存在的值

python python-3.x pyqt pyqt5 qtablewidget
2个回答
2
投票

问题是,与currentIndex()关联的行在删除与currentRow()相同的行后减少1,因此解决方案是在删除该行后建立currentIndex具有相同的位置:

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

0
投票

在绊倒selectrows函数后,为我的问题提供了一个简单的解决方法。将我的else条件替换为以下条件

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

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

© www.soinside.com 2019 - 2024. All rights reserved.