Qt5: Скажите QPlainTextEdit игнорировать изменения подсветки синтаксиса
У меня есть QPlainTextEdit
виджет в моем приложении, которое имеет QSyntaxHighlighter
назначен на это. При каждом изменении содержимого в этой области редактирования текста мне нужно получать уведомление (чтобы обновить глобальное состояние сохранения / изменения приложения). Однако сигнал textChanged()
также выдается каждый раз, когда маркер начинает работать, что мне нужно как-то отфильтровать.
Я уже посмотрел на modificationChanged()
но это тоже не работает Он игнорирует изменения выделения и успешно уведомляет меня о первом изменении содержимого, но не о любых последующих изменениях. В документации упоминается, что я должен иметь возможность сбросить внутреннее состояние с setModified(false)
но этот метод, кажется, не существует.
Любые идеи о том, как отфильтровать изменения?
Должен ли я перейти на QTextDocument
который, кажется, имеет один contentsChanged()
что значит игнорировать изменения подсветки синтаксиса?
3 ответа
Оказывается, я уже был на правильном пути... просто не до конца
Мне действительно нужно слушать modificationChanged
сигналы, поскольку они посылаются при изменении содержимого (которые являются соответствующими событиями для моего приложения, за исключением обработки состояния).
Однако я изначально не видел способа сброса внутреннего состояния модификации (например, когда мое приложение сохраняет свое состояние). Причина была в том, что setModified(bool)
не существует для QPlainTextEdit
, но я понял, что каждый из этих объектов имеет QTextDocument
внутренне, у которого есть этот метод. Поэтому я просто называю это каждый раз, когда мне нужно сбросить состояние на неизмененное:
m_pPlainTextEdit->document()->setModified(false);
В результате, когда содержимое меняется в следующий раз, modificationChanged
будет выдан снова, чтобы я мог реагировать на него и, например, включить значок "Сохранить".
Кстати: сигнал contentsChanged
от QTextDocument
также генерируется при изменениях форматирования, поэтому не помогает в моем сценарии.
Я не проверял это, это просто идея.
Когда пользователь изменяет текст, это QKeyEvent.
Когда делает подсветку, это своего рода QInputMethodEvent (?)
Что вы можете сделать, это проверить, является ли событие QKeyEvent, и если это не так, заблокируйте его.
Вы можете создать класс filterobject или просто определить следующий метод в классе, который содержит QTextEdit.
bool MyClass::eventFilter(QObject *o, QEvent *e)
{
if (e->type() == QKeyEvent) //The user modified the text edit
return false;
else
return true;
}
И вы должны установить его (например, в конструкторе), если вы определили его в классе, который содержит QTextEdit:
myTextEdit->installEventFilter(this);
Вместо того, чтобы подключаться к modifyChanged() и каждый раз сбрасывать измененный флаг, вы можете просто подключиться к textChanged(). Это срабатывает каждый раз, когда вы вносите изменения в документ, независимо от того, было ли ранее изменено или нет...