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