PyQt5 QPlainText.setPlainText блокирует undo/redo

имеется подобный код:

from PyQt5 import QtGui
from PyQt5.QtGui import QKeySequence
from PyQt5.QtWidgets import QWidget, QPlainTextEdit, QUndoStack

class CodeField(QPlainTextEdit):
    def __init__(self, w):
        super(CodeField, self).__init__(w)

        stack = QUndoStack(self)
        stack.setUndoLimit(100)
        self.undo, self.redo = stack.undo, stack.redo

    def keyPressEvent(self, e: QtGui.QKeyEvent) -> None:
        if e == QKeySequence.Undo:
            self.undo()
        if e == QKeySequence.Redo:
            self.redo()
        super(CodeField, self).keyPressEvent(e)

class CodeEditor(QWidget):
    def __init__(self, widget):
        super(CodeEditor, self).__init__(widget)

        self.code_field = CodeField(self)
        self.code_field.textChanged.connect(self.code_changed)
    
        self.changed = False

    def code_changed(self):
        if self.changed:
            self.changed = False
            return
        text = self.code_field.toPlainText()
    
        # некоторые операции с текстом

        self.changed = True
        self.code_field.setPlainText(text)

При редактировании текста и нажатием сочетания undo/redo, ничего не происходит, убираю строку self.code_field.setPlainText(text) в CodeEditor.code_changed, сочетания работают.

Перебрал все варианты, но так и не понял, от чего это зависит.


Ответы (1 шт):

Автор решения: S. Nick

void QPlainTextEdit::setPlainText(const QString &text)

Изменяет текст редактирования текста на text строки. Любой предыдущий текст удаляется.

Notes:

  • История undo/redo также очищается. !!!
  • currentCharFormat() сбрасывается, если textCursor () уже не находится в начале документа.

Больше... https://doc.qt.io/qt-5/qplaintextedit.html#setPlainText

→ Ссылка