Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: xintrea от Июнь 19, 2009, 10:36



Название: Класс, унаследованный от QTextEdit. Не могу обновить изображение текста.
Отправлено: xintrea от Июнь 19, 2009, 10:36
Здравствуйте!


В соседней теме

QTextEdit - как показать невидимые символы (пробелы, табы, переводы строк)
http://www.prog.org.ru/topic_9783_0.html (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. Результат везде одинаковый - обновления не происходит.


Вопрос - как принудительно обновить область виджета, чтобы он полностью перерисовался?


Название: Re: Класс, унаследованный от QTextEdit. Не могу обновить изображение текста.
Отправлено: pastor от Июнь 19, 2009, 10:44
viewport()->update() пробовал?


Название: Re: Класс, унаследованный от QTextEdit. Не могу обновить изображение текста.
Отправлено: xintrea от Июнь 19, 2009, 12:13
viewport()->update() пробовал?

Во, таг работает.