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

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

Страниц: [1] 2 3 4   Вниз
  Печать  
Автор Тема: Техника отлова  (Прочитано 23292 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Февраль 19, 2015, 10:51 »

Добрый день

Вот замечаю что какой-то виджет у меня перерисовывается хотя по моим расчетам не должен. Очень трудно нвйти чем это вызвано. Ну конечно просмотрел все его update и парентов его - ничего. Ставлю breakpont в paintEvent - ничего не дает, событие QEvent::UpdateRequest было извлечено из очереди, ну он и рисует как положено. А поставить точку на update() - так там будет останавливаться мульен раз. Как же отловить мерзавца?

Спасибо
« Последнее редактирование: Февраль 26, 2015, 20:27 от Igors » Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #1 : Февраль 19, 2015, 12:47 »

не использовать отладчик, а логировать факт перерисовки (в разных местах) в консоль
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #2 : Февраль 19, 2015, 13:24 »

красить все виджеты при n перерисовке в красный цвет, а при n+1 в зелёный. "Мерзавец" будет выделяться.
Записан
Bepec
Гость
« Ответ #3 : Февраль 19, 2015, 15:25 »

А никак. послать евент может любой, а вот узнать кто его послал как бы нереально.

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

Но это на мой взгляд слишком затратно.
« Последнее редактирование: Февраль 19, 2015, 18:11 от Bepec » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Февраль 20, 2015, 11:51 »

не использовать отладчик, а логировать факт перерисовки (в разных местах) в консоль
красить все виджеты при n перерисовке в красный цвет, а при n+1 в зелёный. "Мерзавец" будет выделяться.
Ну кто перерисовывпется - я и так прекрасно знаю, достаточно печатать в notify. Но вот почему?

PS с другой стороны можно взять исходники куте, врубить дебаг и поставить брекпоинт с условием на присвоение типа евенту.
Увы, это намертво кладет IDE  Улыбающийся
Записан
Fat-Zer
Гость
« Ответ #5 : Февраль 20, 2015, 12:06 »

Увы, это намертво кладет IDE  Улыбающийся
а если по-мужски, в голом gdb?
Записан
Bepec
Гость
« Ответ #6 : Февраль 20, 2015, 12:18 »

Ммм.. Вопрос - а чем вам мешает лишняя перерисовка?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Февраль 20, 2015, 15:44 »

а если по-мужски, в голом gdb?
Мысль интересная, хотя требует изучения подробностей командной строки. Спасибо
Ммм.. Вопрос - а чем вам мешает лишняя перерисовка?
Пока ничем, но мириться с этим непрофессионально
Записан
Bepec
Гость
« Ответ #8 : Февраль 20, 2015, 16:36 »

Я б на вашем месте не мучался. Т.е. там же идёт цепочка от самого верхнего окна до вашего виджета. Вполне вероятно кто то из них обновляется.

PS мириться с тем, что не мешает - это нормально. А вот когда начинает мешать - вот тогда надо решать вопрос.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Февраль 20, 2015, 16:42 »

PS мириться с тем, что не мешает - это нормально. А вот когда начинает мешать - вот тогда надо решать вопрос.
Вы еще слишком молоды для таких сентенций Улыбающийся Не спешите - стать старым пердуном всегда успеете
Записан
Bepec
Гость
« Ответ #10 : Февраль 20, 2015, 18:49 »

нормальное мнение нормального человека. А вот поиск выдуманных проблем - это уже болезнь.

PS есть такие мании, люди идеально здоровые ищут у себя болячки и находят ведь.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #11 : Февраль 22, 2015, 20:01 »

Если так хочется, можно в paintEvent() флаг завести, и игнорировать те перерисовки, которые кажется вроде бы не нужны. Потом доблестно бороться с глюками, которые вылезут в новых ситуациях.

Мне тоже некоторое время казалось, что paintEvent() слишком часто вызывается. Во-первых, сделал оптимизацию, повыносил оттуда все константные вычисления и прочее что не меняется. Во-вторых, решил, что раз Qt его вызывает, значит ему это зачем-то нужно. Может для каких-то внутренних процедур, которые на экране не видны - кэширования, оптимизаций и т.д.
« Последнее редактирование: Февраль 22, 2015, 20:05 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Февраль 23, 2015, 12:06 »

нормальное мнение нормального человека. А вот поиск выдуманных проблем - это уже болезнь.

PS есть такие мании, люди идеально здоровые ищут у себя болячки и находят ведь.
Если так хочется, можно в paintEvent() флаг завести, и игнорировать те перерисовки, которые кажется вроде бы не нужны. Потом доблестно бороться с глюками, которые вылезут в новых ситуациях.
А так у меня и сделано для QOpenGLWidget Улыбающийся иначе (в 5.4) работать невозможно

Рекомендации "на основании опыта/здравого смысла" часто показывают отсутствие таковых Улыбающийся Напр совет "забить на перерисовку" означает что ничего объемного человек еще не рисовал, секунд в paintEvent не имел - однако ж бойко дает общие советы Улыбающийся. И вообще вопрос был "как" ловить, а не "зачем".

Возвращаясь к теме: да, все-таки условный breakpoint в update, в конце-концов заставил его работать. Оказалось QTreeWidget по умолчанию вызывает update при смене фокуса окна. Зачем - хз, ведь фокус самого виджета не меняется. Отключить легко (если знать причину)  
Записан
Bepec
Гость
« Ответ #13 : Февраль 23, 2015, 12:20 »

Если б вы сказали о том, что у вас каждая перерисовка тормозит - это повод задуматься. А когда вы пишите, что вас нервирует лишняя - значит дурью маетесь Улыбающийся
PS мой совет ведь помог?  помог) Так что цените Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Февраль 26, 2015, 20:33 »

Вот новая проблема, тоже дело упирается в "как поймать".

Есть QOpenGLWidget в котором юзер двигает объекты с помощью мыши. В какой-то момент виден "чужой" кадр, никак не связанный со сценой, но что там - рассмотреть не удается, глаз воспринимает это как помеху/мельтешение. Для начала надо хоть как-то на нем остановиться, но как?
Записан
Страниц: [1] 2 3 4   Вверх
  Печать  
 
Перейти в:  


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