Здравствуйте!
В соседней теме
QTextEdit - как показать невидимые символы (пробелы, табы, переводы строк)http://www.prog.org.ru/topic_9783_0.htmlобсудили, как поверх текста рисовать символы разметки текста. Символы разметки рисуются. Для этого у меня используется класс EditorTextArea, унаследованный от QTextEdit, и в котором переопределён метод paintEvent().
Но теперь встала другая проблема. Есть кнопочка, которая включает/выключает отображение символов разметки текста. При её нажатии нужно обновить виджет так, чтоб вся область текста, и символы разметки поверх, обновились (т.е. символы разметки должны либо появиться, либо пропасть).
Я делаю так
void EditorTextArea::set_showformatting(bool i)
{
showformatting_flag=i;
int w=viewport()->width(), h=viewport()->height();
QTextEdit::update(0,0,w,h);
QTextEdit::repaint(0,0,w,h);
update(0,0,w,h);
repaint(0,0,w,h);
}
void EditorTextArea::paintEvent(QPaintEvent *event)
{
// Отрисовка родительского класса
QTextEdit::paintEvent(event);
// Если символы форматирования ненужно рисовать
if(showformatting_flag==false) return;
// Рисуются символы форматирования
...
}
При вызове метода set_showformatting(), картинка на экране, по идее, должна обновиться. Но этого не происходит. Обновляется только та часть текста, которая появляется новой на экране (если, например, покрутить прокрутку). То есть, если, к примеру, включить отображение символов форматирования set_showformatting(true), то на экране они не покажутся. И если начать скроллировать текст, то на новом появляющемся тексте символы форматирования будут видны. А нужно, чтобы были стали видны сразу, на всём отображаемом в данный момент тексте.
Я пробовал вызывать update() и repaint() без параметров, и вызывать как слоты через emit. Результат везде одинаковый - обновления не происходит.
Вопрос - как принудительно обновить область виджета, чтобы он полностью перерисовался?