January 18, 2023

Перемещение строки вверх и вниз в QTableWidget


Рассмотрим виджет QTableWidget и две кнопки «двигаться вверх» и «двигаться вниз». При нажатии на «Переместить вверх» текущая строка должна переместиться на одну строку вверх, аналогично «перемещению вниз».

Как проще всего реализовать соответствующие функции перемещения вверх и вниз?

def move_down(self):
        """
        Перемещение строки в таблице вниз.
        Определяем индекс текущей строки и столбца. Сравниваем текущий
        индекс строки. Если он меньше, чем текущий индекс - 1, создаем
        новую строку. Запускаем цикл в диапазоне количества столбцов, перемещаем
        содержимое вниз. После цикла удаляем строку, которую нужно было переместить.
        """
        row = self.ui.fileView.currentRow()
        column = self.ui.fileView.currentColumn()
        if row < self.ui.fileView.rowCount() - 1:
            self.ui.fileView.insertRow(row + 2)
            for i in range(self.ui.fileView.columnCount()):
                self.ui.fileView.setItem(row + 2, i, self.ui.fileView.takeItem(row, i))
                self.ui.fileView.setCurrentCell(row + 2, column)
            self.ui.fileView.removeRow(row)

    def move_up(self):
        """
        Перемещение строки в таблице вверх. Повторяем все те же операции, но сравниваем
        индекс текущей строки с нулем. Пока он больше, можем перемещать.
        """
        row = self.ui.fileView.currentRow()
        column = self.ui.fileView.currentColumn()
        if row > 0:
            self.ui.fileView.insertRow(row - 1)
            for i in range(self.ui.fileView.columnCount()):
                self.ui.fileView.setItem(row - 1, i, self.ui.fileView.takeItem(row + 1, i))
                self.ui.fileView.setCurrentCell(row - 1, column)
            self.ui.fileView.removeRow(row + 1)