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 值相同,直到通过鼠标单击选择新行
这里需要一些专家建议。
我正在使用 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 值相同,直到通过鼠标单击选择新行