У меня есть текстовый редактор, который преобразует латинские клавиши клавиатуры в русские символы. Я переопределил класс QTextEdit:
class MyTextEdit(QTextEdit):
def __init__(self, *args):
QTextEdit.__init__(self, *args)
leftMousePressedSignal = pyqtSignal(QPoint)
rightMousePressedSignal = pyqtSignal(QPoint, QEvent)
mouseMovedSignal = pyqtSignal(QPoint)
mouseDoubleClickedSignal = pyqtSignal(QPoint)
keyPressedSignal = pyqtSignal(QEvent)
def mousePressEvent(self, event):
pos = event.pos()
if event.button() == Qt.LeftButton:
self.leftMousePressedSignal.emit(pos)
elif event.button() == Qt.RightButton:
self.rightMousePressedSignal.emit(pos, event)
def mouseMoveEvent(self, event):
if event.buttons() & Qt.LeftButton:
pos = event.pos()
self.mouseMovedSignal.emit(pos)
def mouseDoubleClickEvent(self, event):
if event.button() == Qt.LeftButton:
pos = event.pos()
self.mouseDoubleClickedSignal.emit(pos)
def keyPressEvent(self, event):
if event.type() == QEvent.KeyPress:
self.keyPressedSignal.emit(event)
, который я затем использую с переопределенным keyPressEvent. Поэтому мне также пришлось переопределить действие Backspace:
self.textEdit = MyTextEdit(self)
...
self.textEdit.keyPressedSignal.connect(self.OnKeyPressed)
self.actionSelectAll.triggered.connect(self.textEdit.selectAll)
...
def OnKeyPressed(self, event):
key = event.key()
txt = str(event.text())
if key == Qt.Key_Backspace:
if self.cursor.hasSelection():
self.cursor.movePosition(QTextCursor.NoMove, QTextCursor.KeepAnchor, self.cursor.selectionStart() - self.cursor.selectionStart())
else:
self.cursor.movePosition(QTextCursor.PreviousCharacter, QTextCursor.KeepAnchor, 1)
self.textEdit.setTextCursor(self.cursor)
self.textEdit.cut()
elif key == Qt.Key_A and (event.modifiers() & Qt.ControlModifier):
self.textEdit.selectAll()
Теперь, если ничего не выбрано и я нажимаю клавишу Backspace, он удаляет один символ слева от курсора. Когда слово выделяется мышью, и я нажимаю клавишу Backspace, оно удаляет слово. Когда с помощью мыши выделяется несколько слов или весь текст, и я нажимаю клавишу Backspace, он удаляет все выделение. Итак, все работает отлично. Когда я нажимаю кнопку Выбрать все (или Ctrl + A) - она выделяет весь текст. Но если я затем нажимаю клавишу Backspace, он удаляет только 1 символ слева от курсора, а не весь текст.
Я буду очень признателен, если вы скажете мне, что я здесь не так делаю. Спасибо.