PyQt - sellectAll, тогда Backspace для удаления не работает - PullRequest
0 голосов
/ 09 января 2012

У меня есть текстовый редактор, который преобразует латинские клавиши клавиатуры в русские символы. Я переопределил класс 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 символ слева от курсора, а не весь текст.

Я буду очень признателен, если вы скажете мне, что я здесь не так делаю. Спасибо.

1 Ответ

0 голосов
/ 09 января 2012

Почему вы повторно реализуете выбор и удаление, и почему это не сделано в 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)

UPDATE

Вот моя грубая реализация 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_())

транслитератор доступен на гист

...