PyQt - 全选后按Backspace删除无效
我有一个文本编辑器,可以把拉丁键盘的按键转换成俄文字母。我重新实现了一个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来处理按键事件。所以我也需要重新实现退格键的功能:
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()
现在,如果没有选中的内容,我按下退格键,它会删除光标左边的一个字符。当我用鼠标选中一个单词并按下退格键时,它会删除这个单词。当我用鼠标选中几个单词或者整个文本并按下退格键时,它会删除所有选中的内容。所以这一切都正常工作。当我按下全选按钮(或者Ctrl+A)时,它会选中整个文本。但是如果我接着按下退格键,它只会删除光标左边的一个字符,而不是整个文本。
如果你能告诉我我哪里做错了,我会非常感激。谢谢。
1 个回答
0
你为什么要重新实现选择和删除的功能,而且为什么不在 MyTextEdit
里做呢?如果你只是想要
把拉丁字母的键盘输入转换成俄文字母
那么你只需要做这个转换,其他的工作(比如选择、删除、复制等等)可以交给 QTextEdit
来处理。
我会这样写:
class TransliterationEdit(QTextEdit):
latin_alphabet = unicode(string.ascii_letters) # or dict with transliteration table
def translateLetter(self, letter):
return u'Ъ' # just example, you need translate letter somehow
def keyPressEvent(self, event):
text = unicode(event.text())
if text and text in self.latin_alphabet:
self.insertPlainText(self.translateLetter(text))
event.ignore()
else:
QTextEdit.keyPressEvent(self, event)
更新
这是我粗略实现的 TextEdit
,它可以把拉丁字母的输入转换成俄文字母,希望能对你有帮助。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from PyQt4.QtGui import *
from transliterator import SMTransliterator
# transliterator available at https://gist.github.com/1600988
class TransliterationEdit(QTextEdit):
def __init__(self, *args, **kwargs):
QTextEdit.__init__(self, *args, **kwargs)
self._transliterator = SMTransliterator()
def keyPressEvent(self, event):
text = unicode(event.text())
if not self._transliterator.add_letter(text):
if text and self._transliterator.result:
self.insertPlainText(self._transliterator.result)
return QTextEdit.keyPressEvent(self, event)
if self._transliterator.need_next:
return # skip it
self.insertPlainText(self._transliterator.result)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = TransliterationEdit()
window.show()
sys.exit(app.exec_())
转换器可以在 gist 找到