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(). Это срабатывает каждый раз, когда вы вносите изменения в документ, независимо от того, было ли ранее изменено или нет...

Другие вопросы по тегам