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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Несколько раз возникает событие перерисовки paintEvent()  (Прочитано 3210 раз)
Bolonat
Чайник
*
Offline Offline

Сообщений: 56


Qt Creator 4.5.0 на Qt 5.10.0 (W10 x64) MinGW 5.3.


Просмотр профиля
« : Сентябрь 17, 2017, 13:42 »

Здравствуйте!
Не могу понять, почему возникают лишние события перерисовки paintEvent(). У меня на форме несколько виджетов, для каждого определено свое событие paintEvent().
При вызове update() всей формы вывожу в отладчик сообщения о наступлении события paintEvent() для каждого виджета,  в результате наблюдаю такую картину:

Код:
//Первоначальная отрисовка всего, что нужно, т.е. законно отрабатывающие события paintEvent()

NameChannelPanel::paintEvent()
ChannelValuePanel::paintEvent(()
GLWidget::paintGL()
TimeValuePanel::paintEvent()

//Все что нужно уже отрисовалось и я вижу это на экране, далее идут непонятно с чем связанные события paintEvent()
//и повторяются для каждого виджета аж 4 раза

NameChannelPanel::paintEvent()
ChannelValuePanel::paintEvent()
TimeValuePanel::paintEvent()

NameChannelPanel::paintEvent()
ChannelValuePanel::paintEvent()
TimeValuePanel::paintEvent()

NameChannelPanel::paintEvent()
ChannelValuePanel::paintEvent()
GLWidget::paintGL()
TimeValuePanel::paintEvent()

NameChannelPanel::paintEvent()
ChannelValuePanel::paintEvent()
TimeValuePanel::paintEvent()
В результате на больших объемах данных программа тормозит.
Записан
Bepec
Гость
« Ответ #1 : Сентябрь 17, 2017, 14:30 »

Значения у вас выставляются, скорее всего.
Более подробно можно будет догадаться, увидев ваши виджеты, или хотя бы примерное описание.

Первый paintEvent отрисовывает фон/виджеты без значений. Второй вызывается когда устанавливаются граничные значения. Третий - когда устанавливаются текущие значения.

PS а так непонятно на самом деле, но вы по коду посмотрите, что может вызывать отрисовку виджетов и всё сразу станет ясно.
Записан
Bolonat
Чайник
*
Offline Offline

Сообщений: 56


Qt Creator 4.5.0 на Qt 5.10.0 (W10 x64) MinGW 5.3.


Просмотр профиля
« Ответ #2 : Сентябрь 17, 2017, 14:51 »

Значения у вас выставляются, скорее всего. [...]
Спасибо. Разобралась уже. Оказывается, если рисуешь на пустом виджете, то PaintEvent возникает один раз, но если рисуешь на виджете, на который добавлено еще что-то (например, кнопка), то количество  PaintEvent() растет в геометрической прогрессии.
Записан
Bepec
Гость
« Ответ #3 : Сентябрь 17, 2017, 16:12 »

И да, уберите отладочные сообщения из paintEvent. Именно они тормозят вашу программу, а не сама отрисовка.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Сентябрь 18, 2017, 11:26 »

//Все что нужно уже отрисовалось и я вижу это на экране, далее идут непонятно с чем связанные события paintEvent()
А как Вы увидели что все отрисовалось? Если остановились в отладчике, то это могло сменить фокус что провоцирует новый paintEvent.

А вообще для этой (и многих других) ситуаций нужно печатать трассу событий

Записан
Bolonat
Чайник
*
Offline Offline

Сообщений: 56


Qt Creator 4.5.0 на Qt 5.10.0 (W10 x64) MinGW 5.3.


Просмотр профиля
« Ответ #5 : Сентябрь 19, 2017, 09:04 »

А как Вы увидели что все отрисовалось? Если остановились в отладчике, то это могло сменить фокус что провоцирует новый paintEvent.
Остановилась в отладчике. Работаю с двумя мониторами, экранная форма отображалась на отдельном мониторе, поэтому не сворачивалась и не перекрывалась, так что новое событие paintEvent не спровоцировалось.
« Последнее редактирование: Сентябрь 21, 2017, 06:43 от Bolonat » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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