Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: yarick от Сентябрь 30, 2012, 14:17



Название: рекурсия в paintEvent
Отправлено: yarick от Сентябрь 30, 2012, 14:17
Работаю с QTextEdit, текст генерируется из памяти из специальных объектов.
Перезаписал paintEvent чтобы перед каждым репейнтом переделывать текст в соответствии с его объектным представлением.
Однако setHtml вызывает повторно paintEvent, и получается рекурсия, выдаёт "..  paintEvent # 550 ..." и так далее....

Долго гуглил, лазал по форумам, однако не setUpdatesEnabled, не processEvents, не булева переменная НЕ ПОМОГЛИ!!! ВСё равно рекурсия, несмотря на то что всё должно быть обработано.
Ядро одно подвисает на 100% от рекурсии
Код:
void Paragraph::paintEvent(QPaintEvent* pe)
{
  static int countP=0;

if(isPainting)return;
  isPainting=true;//Булевская переменная чтобы предотвратить рекурсию

  setUpdatesEnabled(false);

  qDebug()<<"paintEvent #"<<countP++;

  int lastCursorPos = textCursor().position();//Сохраняю курсор

  setHtml(textPar);

  setTextCursorPosition(lastCursorPos);//Восстанавливаю курсор
 

  QTextEdit::paintEvent(pe);//вызываю репайнт текста

  QApplication::processEvents();// Все репайнты должны быть обработаны здесь
  setUpdatesEnabled(true);

isPainting=true;
}


Название: Re: рекурсия в paintEvent
Отправлено: navrocky от Сентябрь 30, 2012, 15:29
Тут попахивает жутчайшим извратом - в paintevent переделывать текст.....  :-\



Название: Re: рекурсия в paintEvent
Отправлено: GreatSnake от Сентябрь 30, 2012, 15:32
Да уж, сколько времени здесь нахожусь и не припомню подобных извращений.


Название: Re: рекурсия в paintEvent
Отправлено: pastor от Октябрь 02, 2012, 06:13
Код
C++ (Qt)
setUpdatesEnabled(true);

Цитировать
Re-enabling updates implicitly calls update() on the widget.


А в целом, код очень мрачный.