Имеется 2 функции: одна выделяет текущий найденный текст стандартным синим цветом, вторая выделяет найденный текст по всему виджету голубеньким.
В первой функции выделение текста происходит т.о.:
QTextCursor cursor=edit->textCursor();
cursor.setPosition(pos);
cursor.setPosition(pos+searched.length(),QTextCursor::KeepAnchor);
edit->setTextCursor(cursor);
Во второй функции так (я привожу часть кода, здесь это происходит в цикле по всему виджету):
cursor.setPosition(pos);
cursor.setPosition(pos+searched.length(),QTextCursor::KeepAnchor);
QTextCharFormat charFormat = cursor.charFormat();
charFormat.setBackground(QColor(150, 200, 250));
cursor.setCharFormat(charFormat);
При этом вот какую странность я обнаружил: в первом случае обязательно писать:
edit->setTextCursor(cursor);
Оно и понятно, мы получили копию QTextCursor и, чтобы его применить к QTextEdit, нам нужно вызвать эту функцию.
Но во второй функции почему-то работает без этого, когда мы вызываем setCharFormat.
Так вот. Проблема в том, что во второй функции выделение накапливается и не сбрасывается, когда меняется поисковый запрос, а в первой функции все нормально.
Пытался решить эту проблему с помощью функции clearSelection() перед циклом с выделением, но не помогло. Помогло другое. Перед циклом я выделил весь текст и задал ему фоновый цвет такой, какой был:
cursor.setPosition(0);
cursor.setPosition(edit->toPlainText().length(),QTextCursor::KeepAnchor);
QTextCharFormat charFormat = cursor.charFormat();
charFormat.setBackground(edit->palette().base());
cursor.setCharFormat(charFormat);
После этого, при изменении поискового запроса старые выделения текста удаляются, но появилась новая проблема: почему-то сбрасываются шрифты в тексте. Если эту странную операцию не делать, то шрифты не сбрасываются.
Может, это просто баги в Qt, не знаю. Версия Qt4.8.6. К сожалению проект большой мне достался, переводить его на другую версию Qt что-то не хочется.