Python PyQt5 – выбор вставленного текста курсора?

У меня есть виджет 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()

person braedynl    schedule 03.11.2019    source источник
comment
Извините, но ваш вопрос мне немного неясен. Вы хотите выбрать только что вставленный текст, переместив курсор в начало выделения?   -  person musicamante    schedule 04.11.2019
comment
Ах да, извините, если это было неясно. Я хочу, чтобы каждый раз, когда пользователь нажимал пробел, программа вставляла определенное слово сразу после этого вставленного слова, выделенного/выбранного. В идеале я бы хотел, чтобы курсор находился в начале вставленного слова, да.   -  person braedynl    schedule 04.11.2019
comment
Я обновил свой исходный пост, чтобы лучше уточнить, о чем я спрашиваю, если это все еще неясно.   -  person braedynl    schedule 04.11.2019
comment
Это как предложение автозаполнения?   -  person Guimoute    schedule 04.11.2019
comment
@Guimoute Да, это так. Это для универского проекта. Я сделал модель Маркова с нуля и просто пытаюсь создать хороший способ представить ее.   -  person braedynl    schedule 04.11.2019


Ответы (1)


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

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)
person musicamante    schedule 03.11.2019
comment
Пожалуйста. В любом случае, будьте осторожны с этим видом редактирования. Если, как спросил @Guimoute в комментарии к вашему первоначальному вопросу, вы ищете какое-то автозаполнение, вам лучше изучить QCompleter; в то время как его реализация может быть/выглядеть немного сложной в начале (особенно для виджетов, которые не поддерживают его напрямую, например Q[Plain]TextEdit), обычно лучше не пытаться заново изобретать колесо. - person musicamante; 04.11.2019
comment
О, а я и не знал, что такое существует. Я посмотрю на это. И да, то, что я делаю, это для уни проекта. Я написал марковскую модель с нуля и просто пытаюсь придумать способ ее представить. Я в значительной степени заново изобрел колесо, потому что существует множество библиотек марковских моделей, но часть требований проекта состоит в том, чтобы показать, что вы знаете, как создать одну из моделей, о которых мы говорили в классе, и поэтому марковская модель была единственной. Меня больше всего интересовало. - person braedynl; 04.11.2019
comment
Нет ничего плохого в том, чтобы заново изобретать велосипед, изучая что-то. Проблема возникает, когда мы чрезмерно усложняем вещи всякий раз, когда в этом нет необходимости: если вам нужно продемонстрировать, что вы можете написать функцию, которая суммирует список целых чисел, вы, вероятно, не напишете функцию, которая преобразует эти числа в их двоичные значения, использует бинарные операторы для добавления этих значений и возвращает конечное значение, преобразованное в целое число ;-) - person musicamante; 04.11.2019