Использование клавиши Tab для добавления строки в QTableWidget

#pyside2 #qtablewidget

#pyside2 #qtablewidget

Вопрос:

Я разрабатываю приложение для приготовления рецептов, используя QTableWidget для добавления ингредиентов для рецепта. Я использую кнопку, чтобы добавить строку для вставки нового ингредиента. Это работает хорошо, но, как и во многих существующих приложениях, я хотел бы использовать клавишу tab для добавления новой строки, когда последний столбец в последней строке находится в фокусе. Я предполагаю, что я должен определить нажатую клавишу tab и какой столбец и строка находятся в фокусе, но я не совсем понимаю, как это сделать.

Ответ №1:

Самый простой способ — создать подкласс виджета таблицы и реализовать closeEditor() функцию, которая вызывается всякий раз, когда делегат сигнализирует о том, что редактор будет закрыт, и предлагает следующее действие после закрытия.
При использовании клавиши tab EditNextItem используется подсказка, поэтому достаточно проверить наличие этого флага, убедиться, что текущий индекс является последним столбцом последней строки, а затем добавить строку перед вызовом базового метода реализации:

 class TableWidget(QtWidgets.QTableWidget):
    def closeEditor(self, editor, hint):
        if hint == QtWidgets.QAbstractItemDelegate.EditNextItem:
            current = self.currentIndex()
            if (current.row() == self.rowCount() - 1 and 
                current.column() == self.columnCount() - 1):
                    self.insertRow(self.rowCount())
        super().closeEditor(editor, hint)
 

Комментарии:

1. Спасибо за ввод. Я думаю, что понимаю, но нуждается в небольшом изучении. Я очень слаб в делегатах. Один вопрос, почему функция super(), вызываемая в конце функции closeEditor, перезаписывается?

2. @Liamdale приведенный выше код использует делегат виджета таблицы по умолчанию. Базовая реализация closeEditor пытается начать редактирование в следующей возможной ячейке, если вы не создадите новую строку до этого, она явно не сможет начать новое редактирование в следующей строке, потому что она еще не существует.