у меня есть QPlainTextEdit
виджет в моем приложении, которое имеет QSyntaxHighlighter
назначен на это. При каждом изменении содержимого в этой области редактирования текста мне нужно получать уведомление (чтобы обновить глобальное состояние сохранения / изменения приложения). Однако сигнал textChanged()
также генерируется каждый раз, когда маркер начинает работать, что мне нужно как-то отфильтровать.
Я уже посмотрел на modificationChanged()
, но это тоже не работает. Он игнорирует изменения подсветки и успешно уведомляет меня о первом изменении содержимого, но не о любых последующих изменениях. документация упоминает, что я должен быть в состоянии сбросить внутреннее состояние с setModified(false)
но этот метод, кажется, не существует.
Любые идеи о том, как отфильтровать изменения?
Должен ли я перейти на QTextDocument
который, кажется, имеет один contentsChanged()
тот говорят игнорировать изменения подсветки синтаксиса?
Оказывается, я уже был на правильном пути … просто не до конца
Мне действительно нужно слушать 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 (). Это срабатывает каждый раз, когда вы вносите изменения в документ, независимо от того, было ли ранее изменено или нет …