Python PyQt5 - Выбор вставленного текста курсора? - PullRequest
1 голос
/ 04 ноября 2019

У меня есть виджет QPlainTextEdit, и я пытаюсь получить курсор для автоматического выбора вставленного текста. Моя текущая методология состоит в том, чтобы выбирать в обратном порядке, используя QTextCursor.WordLeft, потому что использование .insertText () перемещает курсор в конец этого слова. Спасибо!

Редактировать: Дальнейшее уточнение: в идеале я хочу, чтобы вставленный текст был выделен, с курсором, помещенным в начало этого вставленного слова. Например: Состояние 1 -> Состояние 2

Состояние 1 показывает вводимое слово. Затем, когда пользователь нажимает пробел, программа вставляет слово, выделяет его и помещает курсор в начало вставленного слова, показанного в состоянии 2.

class TextBox(QPlainTextEdit):
    def __init__(self):
        QPlainTextEdit.__init__(self)

        font = QtGui.QFont()
        font.setPointSize(12)
        self.setFont(font)

    def keyPressEvent(self, keyEvent):
        super(TextBox, self).keyPressEvent(keyEvent)

        if keyEvent.key()  == Qt.Key_Return :
            self.clear()

        elif keyEvent.key() == Qt.Key_Space:
            cursor = self.get_cursor()
            cursor.insertText("test")    # The area of concern
            cursor.selectionStart()
            cursor.movePosition(QtGui.QTextCursor.WordLeft, QtGui.QTextCursor.KeepAnchor, 1)
            cursor.selectionEnd()
            # Moving the cursor position doesn't seem to do anything


    def get_cursor(self):
        return self.textCursor()

    def get_cursor_pos(self):
        return self.get_cursor().position()

1 Ответ

3 голосов
/ 04 ноября 2019

Что вам не хватает, так это то, что для применения положения и выделения курсора курсор имеет , который необходимо вернуть к редактированию текста.

class TextBox(QPlainTextEdit):
    # ...

    def keyPressEvent(self, keyEvent):
        super(TextBox, self).keyPressEvent(keyEvent)

        if keyEvent.key()  == Qt.Key_Return :
            self.clear()

        elif keyEvent.key() == Qt.Key_Space:
            cursor = self.textCursor()
            cursor.insertText("test")
            cursor.movePosition(QtGui.QTextCursor.WordLeft, QtGui.QTextCursor.KeepAnchor, 1)
            self.setTextCursor(cursor)

Имейте в виду, что сВы вызываете реализацию keyPressEvent базового класса, и перед текстом «всегда» всегда будет пробел. Если по какой-либо причине вы хотите этого избежать, вам придется игнорировать это всякий раз, когда вы получаете клавишу пробела.

    def keyPressEvent(self, keyEvent):
        if keyEvent.key()  == Qt.Key_Return :
            self.clear()

        elif keyEvent.key() == Qt.Key_Space:
            cursor = self.textCursor()
            pos = cursor.position()
            cursor.insertText("test")
            cursor.setPosition(pos, QtGui.QTextCursor.KeepAnchor)
            self.setTextCursor(cursor)
            # by returning, the event won't be sent to the default implementation
            return

        super(TextBox, self).keyPressEvent(keyEvent)
...