Qt5: Скажите QPlainTextEdit игнорировать изменения подсветки синтаксиса

у меня есть QPlainTextEdit виджет в моем приложении, которое имеет QSyntaxHighlighter назначен на это. При каждом изменении содержимого в этой области редактирования текста мне нужно получать уведомление (чтобы обновить глобальное состояние сохранения / изменения приложения). Однако сигнал textChanged() также генерируется каждый раз, когда маркер начинает работать, что мне нужно как-то отфильтровать.

Я уже посмотрел на modificationChanged(), но это тоже не работает. Он игнорирует изменения подсветки и успешно уведомляет меня о первом изменении содержимого, но не о любых последующих изменениях. документация упоминает, что я должен быть в состоянии сбросить внутреннее состояние с setModified(false) но этот метод, кажется, не существует.

Любые идеи о том, как отфильтровать изменения?

Должен ли я перейти на QTextDocument который, кажется, имеет один contentsChanged() тот говорят игнорировать изменения подсветки синтаксиса?

4

Решение

Оказывается, я уже был на правильном пути … просто не до конца

Мне действительно нужно слушать modificationChanged сигналы, поскольку они посылаются при изменении содержимого (которые являются соответствующими событиями для моего приложения, за исключением обработки состояния).

Однако изначально я не видел способа сбросить внутреннее состояние модификации (например, когда мое приложение сохраняет свое состояние). Причина была в том, что setModified(bool) не существует для QPlainTextEdit, но я понял, что каждый из этих объектов имеет QTextDocument внутри которого делает есть этот метод. Поэтому я просто называю это каждый раз, когда мне нужно сбросить состояние на неизмененное:

m_pPlainTextEdit->document()->setModified(false);

В результате, когда содержимое меняется в следующий раз, modificationChanged будет выпущен снова, чтобы я мог реагировать на него и, например, включить значок «Сохранить».

КСТАТИ: Сигнал contentsChanged от QTextDocument также генерируется при изменениях форматирования, поэтому не помогает в моем сценарии.

2

Другие решения

Я не проверял это, это просто идея.

Когда пользователь изменяет текст, это 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);
1

Вместо того, чтобы подключаться к modifyChanged () и каждый раз сбрасывать измененный флаг, вы можете просто подключиться к textChanged (). Это срабатывает каждый раз, когда вы вносите изменения в документ, независимо от того, было ли ранее изменено или нет …

-1
По вопросам рекламы [email protected]