Как сохранить QTextCursor от форматирования вновь вставленного текста в QPlainTextEdit - PullRequest
0 голосов
/ 16 февраля 2020

Я создаю IDE для простого языка программирования, с которым я возился, я добавил подсветку синтаксиса благодаря классу QSyntaxHighlighter, теперь я хочу добавить пользовательское форматирование для недопустимого кода.

Это способ форматирования проблемной части кода c с использованием QTextCursor

def error(self, ix, length):
    cursor = self.editor.textCursor()  # editor is a QPlainTextEdit
    cursor.setPosition(ix, QTextCursor.MoveAnchor)  # set cursor position at the beginning of the error
    cursor.movePosition(QTextCursor.Right,  # and move it the specified length, while selecting the text
                        QTextCursor.KeepAnchor,
                        length)
    cursor.setCharFormat(self.error_format)  # error_format is a QTextCharFormat

. Это работает точно так, как задумано, как вы можете видеть ниже. sort является допустимым ключевым словом, как показано жирным шрифтом, установленным QSyntaxHighlighter.

IDE showing a correct keyword and a mistake

Проблема в том, что error_format теперь применяется к любому новому тексту, который вводится в QPlainTextEdit.

error_format being propagated to new text

Так же, как запутался в формате, применяемом QSyntaxHighlighter, как показано ниже, текст по-прежнему подчеркивается как ошибка, даже если теперь он закомментирован, а код действителен. Эта вторая проблема, которую я не слишком подробно изучил, так как я предполагаю, что должен быть способ просто сбросить все форматирование, примененное курсором, я надеюсь, что при решении первой проблемы вторая станет более понятной.

Hybrid between comment and error formatting

Я использую PyQt5. Если что-то неясно, пожалуйста, дайте мне знать. Спасибо.

РЕДАКТИРОВАТЬ: Кажется, проблема в том, что QTextEdit выбирает форматирование последнего символа при вставке нового текста, если я сделаю так, чтобы подсветка ошибок не влияла на конец текста, например, так

enter image description here

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

EDIT2: я частично решил проблема, обнаружив, что я могу установить текущий формат символа непосредственно в текстовом редакторе, поэтому я могу сделать следующее:

old_format = cursor.charFormat()
cursor.setCharFormat(self.error_format)
self.editor.setCurrentCharFormat(old_format)

Теперь мне просто нужно узнать, как сбросить форматирование, когда QSyntaxHighlighter снова проходит через .

РЕДАКТИРОВАТЬ3: Я остановился на решении для моей конкретной цели c, я не буду отвечать на вопрос, поскольку это не совсем ответ на вопрос, который я поставил, а скорее обходной путь.

Это то, что я сделал

# Override
def keyPressEvent(self, event):
    QPlainTextEdit.keyPressEvent(self, event)
    cursor = self.textCursor()
    cursor.select(QTextCursor.Document)
    cursor.setCharFormat(self.default_format)
    cursor.clearSelection()
    self.keyPressed.emit(event)

Когда пользователь вводит что-то новое, все форматирование, примененное курсором, просто удаляется, это работает для меня, так как синтаксис будет проверен d, когда пользователь выполнит код.

...