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

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

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

Сообщений: 11445


Просмотр профиля
« : Январь 29, 2014, 12:33 »

Добрый день

Смотрю что-то paint у меня случается гораздо чаще чем я рассчитывал. Выясняется что его вызывает активный QLineEdit при каждом блинке курсора. Ну если QLineEdit сам хочет перерисоваться - на здоровье, это его личное дело, но зачем окно-то трогать? Как от этого избавиться? Тестовый пример прилагаю.

Спасибо  
« Последнее редактирование: Январь 29, 2014, 14:19 от Igors » Записан
Bepec
Гость
« Ответ #1 : Январь 29, 2014, 12:49 »

В QPaintEvent передаются границы области, которую надо перерисовывать. Избавиться от перерисовки вы не сможете - это механизм Qt.
Перерисовка ребенка вызывает перерисовку родителя и родителя родителя.

Пара вариантов что можно сделать, на мой взгляд -

1) либо блокировать сообщения с координатами вашего lineEdit, но тогда будет множество других проблем, да и блинк рисоваться не будет, да и lineEdit умрёт как интерактивный виджет.
2) либо разбить отрисовку на "области" и в каждом paintEvent'e отрисовывать только передаваемую часть.
3) убрать ресурсоёмкие операции из paintEvent. Потому что я не вижу проблем в отрисовке  всего виджета.
4) есть  конечно и бредовый вариант накладывать нужные вам виджеты на ваш виджет без размещения на нём.
 
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #2 : Январь 29, 2014, 12:57 »

Как от этого избавиться?
Установите QLineEdit атрибут Qt::WA_OpaquePaintEvent, но могут полезть артефакты. Проверьте.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Январь 29, 2014, 14:40 »

Как от этого избавиться?
Установите QLineEdit атрибут Qt::WA_OpaquePaintEvent, но могут полезть артефакты. Проверьте.
Да, спасибо. Детали: ОС генерирует события для нижних виджетов если верхний не "opaque"
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #4 : Январь 29, 2014, 14:46 »

Детали: ОС генерирует события для нижних виджетов если верхний не "opaque"
Ну это просто события EraseBackground, если мы сами полность перерисовываем фон верхнего виджета, то фон затирать не обязательно, а вот если верхний виджет думает что у него чистый фон обеспеченный парентом или он полупрозрачнй, то будут артефакты.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Январь 31, 2014, 09:01 »

Кстати верно и обратное: перерисовка parent'а не вызывает перерисовку child'а с флагом WA_OpaquePaintEvent
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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