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

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

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

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

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


person Philip Allgaier    schedule 27.03.2014    source источник
comment
Вы смотрели фильтры событий?   -  person otisonoza    schedule 29.03.2014
comment
@otisonoza Не могли бы вы уточнить, как они могут помочь в моем случае? Я хочу получать уведомления о сигнале textChanged, но только не в том случае, если он вызван подсветкой.   -  person Philip Allgaier    schedule 29.03.2014


Ответы (3)


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

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

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

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

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

Кстати: сигнал contentsChanged от QTextDocument также излучается при изменении форматирования, поэтому в моем сценарии он бесполезен.

person Philip Allgaier    schedule 04.04.2014

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

Когда пользователь изменяет текст, это QKeyEvent.
Когда подсветка делает это, это своего рода QInputMethodEvent (?)

Что вы можете сделать, так это проверить, является ли событие QKeyEvent, и если это не так, заблокировать его.

Вы можете создать класс объекта фильтра или просто определить следующий метод в классе, содержащем объект 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);
person otisonoza    schedule 29.03.2014
comment
Я рассмотрю вашу идею более подробно, но боюсь, что она не сработает, потому что не mySyntaxHighlighter генерирует событие/сигнал, а QPlainTextEdit. И я действительно хочу это событие в целом, просто не тогда, когда оно вызвано изменением текста из маркера, а только если оно вызвано пользователем (если он/она редактирует текст/контент). - person Philip Allgaier; 29.03.2014

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

person Joao Pincho    schedule 15.07.2014
comment
Да, но я не хочу этого события, если изменение было вызвано QHighlighter. Так что не работает... - person Philip Allgaier; 15.07.2014