Russian Qt Forum
Март 29, 2024, 13:10 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: рекурсия в paintEvent  (Прочитано 3448 раз)
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;
}
« Последнее редактирование: Сентябрь 30, 2012, 14:20 от yarick » Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #1 : Сентябрь 30, 2012, 15:29 »

Тут попахивает жутчайшим извратом - в paintevent переделывать текст.....  В замешательстве

Записан

Гугль в помощь
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #2 : Сентябрь 30, 2012, 15:32 »

Да уж, сколько времени здесь нахожусь и не припомню подобных извращений.
Записан

Qt 5.11/4.8.7 (X11/Win)
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #3 : Октябрь 02, 2012, 06:13 »

Код
C++ (Qt)
setUpdatesEnabled(true);

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


А в целом, код очень мрачный.
« Последнее редактирование: Октябрь 02, 2012, 06:16 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.073 секунд. Запросов: 22.