Russian Qt Forum
Апреля 03, 2025, 23:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: рекурсия в paintEvent  (Прочитано 3704 раз)
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.027 секунд. Запросов: 19.