#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
пытается начать редактирование в следующей возможной ячейке, если вы не создадите новую строку до этого, она явно не сможет начать новое редактирование в следующей строке, потому что она еще не существует.