Python PyQt-sellectAll然后退格删除不';行不通
我有一个文本编辑器,可以将拉丁键盘转换成俄语字符。我重新实现了一个QTextEdit类:Python PyQt-sellectAll然后退格删除不';行不通,python,pyqt,qtextedit,Python,Pyqt,Qtextedit,我有一个文本编辑器,可以将拉丁键盘转换成俄语字符。我重新实现了一个QTextEdit类: class MyTextEdit(QTextEdit): def __init__(self, *args): QTextEdit.__init__(self, *args) leftMousePressedSignal = pyqtSignal(QPoint) rightMousePressedSignal = pyqtSignal(QPoint, QEvent) mouseMovedSigna
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)
然后我将其与重新实现的按键事件一起使用。因此,我还必须重新执行退格操作:
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,它只删除光标左侧的一个字符,而不是整个文本
如果你能告诉我我做错了什么,我将不胜感激。谢谢。为什么要重新执行选择和删除行为,为什么在
mytextdedit
中不执行?如果你只是需要
将拉丁键盘转换为俄语字符
您只能执行此转换,并允许对qtexedit
执行其他工作(选择、删除、复制等)
我会这样写:
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_())
音译器可在上找到,它不是一个直接的字符音译,有时你必须按2个拉丁字符才能得到1个俄语字符。这就是为什么我在课程中,而不是在课堂上这样做的原因。如果我不重新实现所有键,所有非字符键(空格、退格、箭头等)都会被忽略。@user665327,好的,这取决于您在哪里执行,但它非常适合重写的
QTextEdit
类逻辑。添加对2个或更多拉丁语按键的支持很容易。非字符键被忽略,因为您没有调用originalQTextEdit.keyPressEvent(self,event)
。如果你想分开类,你需要在OnKeyPressed
中调用QTextEdit.keyPressEvent(self.textEdit,event)
来处理非拉丁键。你是说除了OnKeyPressed之外,我还必须在我的类中添加另一个QTextEdit.keyPressEvent?很抱歉,我不明白如何在TransliterationEdit类中添加对2次按键的支持。您如何将两个单独的事件(按键)传递给该类?@user665327,不,我的意思是您应该将事件传递给基类实现。看看我提供的代码:当keypress不是拉丁字母时,我将跳过它,方法是调用基类实现。。。其他:QTextEdit.keyPressEvent(self,event)
,这允许处理退格、全选等。大约2次按键,我的意思是您无论如何都需要实现这一点(据我所知,您已经完成了),QTextEdit
没有任何方法来处理这一点,但可以在重写类中完成。我添加了我的粗略实现来回答这个问题。