【问题标题】:Qtablewidget Deleting row issueQtablewidget删除行问题
【发布时间】:2020-04-27 19:03:36
【问题描述】:

在这里需要一些专家建议。

我正在使用 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

#槽

@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,结果是丢失了错误值单元格顶部的值

【问题讨论】:

    标签: python python-3.x pyqt pyqt5 qtablewidget


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。它的工作。同时,当我四处搜索时,我发现了selectrows 函数,它给了我一个简单的解决方法。我也会把它作为答案
    【解决方案2】:

    偶然发现selectrows 函数后,我的问题得到了简单的解决。用下面的替换了我的 else 条件

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 2017-07-14
      • 2013-03-28
      • 2019-02-06
      • 2012-06-19
      • 2016-01-02
      • 2011-04-05
      相关资源
      最近更新 更多