Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Igors от Январь 29, 2014, 12:33



Название: QLineEdit и перерисовка всего окна [решено]
Отправлено: Igors от Январь 29, 2014, 12:33
Добрый день

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

Спасибо  


Название: Re: QLineEdit и перерисовка всего окна
Отправлено: Bepec от Январь 29, 2014, 12:49
В QPaintEvent передаются границы области, которую надо перерисовывать. Избавиться от перерисовки вы не сможете - это механизм Qt.
Перерисовка ребенка вызывает перерисовку родителя и родителя родителя.

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

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


Название: Re: QLineEdit и перерисовка всего окна
Отправлено: Old от Январь 29, 2014, 12:57
Как от этого избавиться?
Установите QLineEdit атрибут Qt::WA_OpaquePaintEvent, но могут полезть артефакты. Проверьте.


Название: Re: QLineEdit и перерисовка всего окна
Отправлено: Igors от Январь 29, 2014, 14:40
Как от этого избавиться?
Установите QLineEdit атрибут Qt::WA_OpaquePaintEvent, но могут полезть артефакты. Проверьте.
Да, спасибо. Детали: ОС генерирует события для нижних виджетов если верхний не "opaque"


Название: Re: QLineEdit и перерисовка всего окна
Отправлено: Old от Январь 29, 2014, 14:46
Детали: ОС генерирует события для нижних виджетов если верхний не "opaque"
Ну это просто события EraseBackground, если мы сами полность перерисовываем фон верхнего виджета, то фон затирать не обязательно, а вот если верхний виджет думает что у него чистый фон обеспеченный парентом или он полупрозрачнй, то будут артефакты.


Название: Re: QLineEdit и перерисовка всего окна [решено]
Отправлено: Igors от Январь 31, 2014, 09:01
Кстати верно и обратное: перерисовка parent'а не вызывает перерисовку child'а с флагом WA_OpaquePaintEvent