Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Bolonat от Сентябрь 17, 2017, 13:42



Название: Несколько раз возникает событие перерисовки paintEvent()
Отправлено: Bolonat от Сентябрь 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()
В результате на больших объемах данных программа тормозит.


Название: Re: Несколько раз возникает событие перерисовки paintEvent()
Отправлено: Bepec от Сентябрь 17, 2017, 14:30
Значения у вас выставляются, скорее всего.
Более подробно можно будет догадаться, увидев ваши виджеты, или хотя бы примерное описание.

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

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


Название: Re: Несколько раз возникает событие перерисовки paintEvent()
Отправлено: Bolonat от Сентябрь 17, 2017, 14:51
Значения у вас выставляются, скорее всего. [...]
Спасибо. Разобралась уже. Оказывается, если рисуешь на пустом виджете, то PaintEvent возникает один раз, но если рисуешь на виджете, на который добавлено еще что-то (например, кнопка), то количество  PaintEvent() растет в геометрической прогрессии.


Название: Re: Несколько раз возникает событие перерисовки paintEvent()
Отправлено: Bepec от Сентябрь 17, 2017, 16:12
И да, уберите отладочные сообщения из paintEvent. Именно они тормозят вашу программу, а не сама отрисовка.


Название: Re: Несколько раз возникает событие перерисовки paintEvent()
Отправлено: Igors от Сентябрь 18, 2017, 11:26
//Все что нужно уже отрисовалось и я вижу это на экране, далее идут непонятно с чем связанные события paintEvent()
А как Вы увидели что все отрисовалось? Если остановились в отладчике, то это могло сменить фокус что провоцирует новый paintEvent.

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



Название: Re: Несколько раз возникает событие перерисовки paintEvent()
Отправлено: Bolonat от Сентябрь 19, 2017, 09:04
А как Вы увидели что все отрисовалось? Если остановились в отладчике, то это могло сменить фокус что провоцирует новый paintEvent.
Остановилась в отладчике. Работаю с двумя мониторами, экранная форма отображалась на отдельном мониторе, поэтому не сворачивалась и не перекрывалась, так что новое событие paintEvent не спровоцировалось.