Вы можете переопределить метод closeEditor()
, который отвечает за действие, которое будет выполнено представлением элемента после завершения редактирования элемента.
В этом примере я переписать метод, как вы это делали с событием нажатия клавиши, но я настоятельно рекомендую вам использовать подклассы и реализовывать в них переопределения, так как код будет чище и поможет избежать путаницы между существующими функциями и / или перезаписанными методами.
class DemoTable(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super(DemoTable, self).__init__()
self.setupUi(self)
#KeyPressEvent
self.tableWidget.keyPressEvent = self.KeyPressed
self.tableWidget.closeEditor = self.closeEditor
def closeEditor(self, editor, hint):
if hint in (QtWidgets.QItemDelegate.EditNextItem,
QtWidgets.QItemDelegate.EditPreviousItem):
# if the hint is to edit the next or previous item, ignore it
newHint = QtWidgets.QItemDelegate.NoHint
else:
newHint = hint
# call the base implementation with the new hint
QtWidgets.QTableWidget.closeEditor(self.tableWidget, editor, newHint)
if hint == QtWidgets.QItemDelegate.EditNextItem:
# find the next item to focus on
index = self.tableWidget.moveCursor(self.tableWidget.MoveNext,
QtCore.Qt.NoModifier)
elif hint == QtWidgets.QItemDelegate.EditPreviousItem:
# find the previous item to focus on
index = self.tableWidget.moveCursor(self.tableWidget.MovePrevious,
QtCore.Qt.NoModifier)
else:
return
# set the new current item
self.tableWidget.setCurrentIndex(index)
# ...
Поскольку вы также хотите переходить к элементам с помощью клавиш со стрелками даже в состоянии редактирования , вы можете сделать это только путем установки пользовательского делегата элемента, который проверяет события клавиатуры в редакторе.
Я должен предупредить вас, хотя: не делайте этого .
Клавиши со стрелками влево и вправо всегда используются для перемещения курсора при редактировании текста, изменении это поведение абсолютно не рекомендуется.
Это неинтуитивно, неестественно, неудобно, против любого обычного и ожидаемого поведения, и сделает пользователей привык к навигации с клавиатуры очень, очень , очень раздражен. Я видел подобное поведение в программе в прошлом, и я могу сказать вам, что это не хорошо и это очень раздражает.
class DelegateYouShouldNotUse(QtWidgets.QStyledItemDelegate):
def eventFilter(self, source, event):
if isinstance(source, QtWidgets.QLineEdit) and event.type() == QtCore.QEvent.KeyPress:
if event.key() == QtCore.Qt.Key_Right:
# tell the view to store the current data
self.commitData.emit(source)
# and to move to the next item (since we've changed the
# behavior of the closeEditor *slot* of the table, it
# will only move to the item, without starting editing
self.closeEditor.emit(source, self.EditNextItem)
return True
elif event.key() == QtCore.Qt.Key_Left:
self.commitData.emit(source)
self.closeEditor.emit(source, self.EditPreviousItem)
return True
return super().eventFilter(source, event)
class DemoTable(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super(DemoTable, self).__init__()
# ...
self.veryBadDelegate = DelegateYouShouldNotUse(self.tableWidget)
self.tableWidget.setItemDelegate(self.veryBadDelegate)
В случае, если это не было не достаточно ясно, вы должны не использовать это: -)