Я создаю 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.
Проблема в том, что error_format
теперь применяется к любому новому тексту, который вводится в QPlainTextEdit.
Так же, как запутался в формате, применяемом QSyntaxHighlighter, как показано ниже, текст по-прежнему подчеркивается как ошибка, даже если теперь он закомментирован, а код действителен. Эта вторая проблема, которую я не слишком подробно изучил, так как я предполагаю, что должен быть способ просто сбросить все форматирование, примененное курсором, я надеюсь, что при решении первой проблемы вторая станет более понятной.
Я использую PyQt5. Если что-то неясно, пожалуйста, дайте мне знать. Спасибо.
РЕДАКТИРОВАТЬ: Кажется, проблема в том, что QTextEdit выбирает форматирование последнего символа при вставке нового текста, если я сделаю так, чтобы подсветка ошибок не влияла на конец текста, например, так
Я могу добавить новый текст внизу, который будет иметь форматирование по умолчанию.
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, когда пользователь выполнит код.