Qtablewidget Удаление проблемы с строкой - PullRequest
0 голосов
/ 10 января 2020

Нужна консультация специалиста здесь.

Использую PyQT5 и Python 3 для настройки пользовательского интерфейса. Я создал таблицу с помощью Qtablwiwdget и смог получить большинство элементов управления. Однако я застрял в операции удаления. Я создал кнопку Удалить , которая удаляет выбранную строку. Я могу достичь этого, передав значение 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 снова. Но этого не происходит. После 1-й операции удаления текущая строка уменьшается с 3 до 2, в результате чего теряются значения, которые присутствовали поверх неправильных значений ячеек

Ответы [ 2 ]

2 голосов
/ 10 января 2020

Проблема заключается в том, что строка, связанная с currentIndex (), уменьшается на 1 после удаления строки, совпадающей с currentRow (), поэтому решение состоит в том, чтобы установить sh, что currentIndex имеет то же местоположение после удаления строка:

# ...
else:        
    self.DataTable.removeRow(SelectedRow)
    <b>ix = self.DataTable.model().index(
        SelectedRow, self.DataTable.currentColumn()
    )
    self.DataTable.setCurrentIndex(ix)</b>
# ...
0 голосов
/ 10 января 2020

Получил простое решение моей проблемы после того, как наткнулся на функцию selectrows. Заменив мое условие else на приведенное ниже,

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

self.DataTable.selectRow делает значение SelectedRow одинаковым до тех пор, пока новая строка не будет выбрана щелчком мыши

...