Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Переопределение QWidget::paintEvent() и мерцание при старте  [new]
petrav
Member

Откуда:
Сообщений: 2109
Есть тут у меня волшебный виджет. Класс унаследованный от QWidget.

Он полностью рисует себя сам, переопределяя метод QWidget::paintEvent().

Так вот при старте приложения этот виджет полностью отображается сереньким и только через мгновение отрисовывается. Раздражает. В конструкторе отрисоваться мы не можем, размеры не известны. Потом прилетает событие resizeEvent(). Главное окно ещё не отображено на экране. Потом всё отображается -- виджет серый. И только потом приходит paintEvent().

Простейшая проблема, не получается решить её. Тут нужно, наверное, какой-то нюанс знать? Или тут косяк где-то? Ведь стандартные контролы так себя не ведут?

Спасибо!
19 май 20, 14:45    [22135830]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50050

petrav
Ведь стандартные контролы так себя не ведут?

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

Posted via ActualForum NNTP Server 1.5

19 май 20, 14:52    [22135838]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
petrav
Member

Откуда:
Сообщений: 2109
Dimitry Sibiryakov

petrav
Ведь стандартные контролы так себя не ведут?

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

Я имел в виду стандартные контролы Qt. Если у нас приложение состоит только из них, то я что-то не помню, что бы при старте приложения появлялось полностью серое окно и только потом вся отрисовка. Вот в чём проблема.
19 май 20, 15:22    [22135875]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4839
petrav,
Ну пришпильте тут проект минимальный в котором только в лог вывод событий onCreate, onPaint, onShow,....,
Могу попробовать у себя.
19 май 20, 16:01    [22135897]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
petrav
Member

Откуда:
Сообщений: 2109
PetroNotC Sharp
petrav,
Ну пришпильте тут проект минимальный в котором только в лог вывод событий onCreate, onPaint, onShow,....,
Могу попробовать у себя.

На днях сделаю. Это всё же за пять минут не сделать, а у меня тут основная работа другая. :) VS или Креатор?

Я только что сделал в Креаторе приложение на 90% площади там QTableWidget. Вот это 5-ть минут. И для контраста (что бы мигание было заметнее) сделал фон таблицы чёрным. Так вон оно сразу чёрным на весь экран и появляется. А моё фуфло белым. Т.е. нужно что бы оно отрисовалось до отображения.
19 май 20, 16:13    [22135906]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
mini.weblab
Member

Откуда:
Сообщений: 823
petrav,
я могу рассказать теорию :)
computer graphics Double Buffer principle

Section 6: Rendering
https://www.udemy.com/course/game-loop-c-sdl/
19 май 20, 16:42    [22135925]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4839
petrav,
1. ОК будем ждать пример
2. Только креатор.
Я когда начинал тут сообщество так решило. И я не прогадал.
19 май 20, 17:09    [22135947]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4839
petrav,
>А моё фуфло белым
А ты не начинай с фуфла и своих компонентов.
Тебе виднее конечно.
У меня заказчик не требует супер пупер наворотов что требует РУЧНОЙ ОТРИСОВКИ.
19 май 20, 17:13    [22135949]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
mayton
Member

Откуда: loopback
Сообщений: 46531
Возможно Qt используют свою систему евентов отдельно от Windows-ной.
В целях совместимости со всеми Gnome, KDE, e.t.c. Отсюда и неприятные
артифакты.
19 май 20, 18:13    [22135977]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
petrav
Member

Откуда:
Сообщений: 2109
PetroNotC Sharp
petrav,
>А моё фуфло белым
А ты не начинай с фуфла и своих компонентов.
Тебе виднее конечно.
У меня заказчик не требует супер пупер наворотов что требует РУЧНОЙ ОТРИСОВКИ.

Тут так принято, в ряде случаев. Это я про ручную отрисовку.

Я тут заметил, что у меня и Qt Creator запускается точно также. Сначала пустое серенькое окно, а потом появляются элементы GUI. Инициативность сразу поугасла. Так что пока отложим проблему. Когда снова случится приступ перфекционизма, я приду с готовым проектом.

Но, меня продолжают терзать смутные сомнения. Где-то тут косяк.
20 май 20, 15:57    [22136466]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50050

petrav
Где-то тут косяк.

Его скурили разработчики Qt когда натягивали свою (а точнее X-windows) архитектуру на всё
остальное.

Posted via ActualForum NNTP Server 1.5

20 май 20, 17:09    [22136542]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4839
petrav,
Любой код, любая строчка это компромисс между сделать лучше и забить))).
ЗЫ.
Кстати, баг одинаков в винде и линуксе?
Я просто пишу в винде а сдаю работу в линуксе.
20 май 20, 18:10    [22136587]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
petrav
Member

Откуда:
Сообщений: 2109
PetroNotC Sharp
petrav,
Любой код, любая строчка это компромисс между сделать лучше и забить))).
ЗЫ.
Кстати, баг одинаков в винде и линуксе?
Я просто пишу в винде а сдаю работу в линуксе.

Я только под Win работаю. Хотя код на 99% кроссплатформенный. Но вот этот один процент может кардинальные проблемы создать.
20 май 20, 18:30    [22136610]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4839
petrav,
Это тоже не понятно.
Если код в продакшене в линуксе, то без тестов там не обойтись. Так как все другое. Может там вашего глюка и нету.
Ну а фраза "все другое", это работа с файловой системой.
А если код только винда, то я бы и Qt не использовал.
Правда тут обсуждение было про гуи от плюсов)))). Тоже не просто)))
Имхо
20 май 20, 18:42    [22136620]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
petrav
Member

Откуда:
Сообщений: 2109
Dimitry Sibiryakov

petrav
Где-то тут косяк.

Его скурили разработчики Qt когда натягивали свою (а точнее X-windows) архитектуру на всё
остальное.

Спорное утверждение. Я заметил, что у меня и NotePad++ так стартует: сначала белый фон окна, а через мгновение тёмный фон текста. А он написан на WinAPI.

Тут может быть проблема даже в Windows. Она с начала должна послать WM_PAINT, закешировать это в контексте устройства вывода, а потом сразу выдать на экран готовый pixmap.
22 май 20, 18:57    [22137866]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4839
petrav
NotePad++ так стартует:

одно дело старт приложения - главного окна.
И другое дела свои окна.
Свои окна должны отображаться нормально. На окно приложения при старте забить.
22 май 20, 19:11    [22137870]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50050

petrav
А он написан на WinAPI.

Это он сам написан на С++, а Scintilla, которую он показывает в главном окне - GTK,
которое по архитектуре растёт из того же места, что и Qt.

Posted via ActualForum NNTP Server 1.5

22 май 20, 20:08    [22137904]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
petrav
Member

Откуда:
Сообщений: 2109
Dimitry Sibiryakov

petrav
А он написан на WinAPI.

Это он сам написан на С++, а Scintilla, которую он показывает в главном окне - GTK,
которое по архитектуре растёт из того же места, что и Qt.

Очень может быть, я об этом не подумал.

Но вернёмся к архитектуре Qt. Неужели происхождение Qt от X-Windows мешает задать свойства WinAPI главного окна так, что бы оно сначала получило WM_PAINT, а только потом ОС это окно выбросило бы на экран в виде готовой картинки?
22 май 20, 20:22    [22137911]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4839
petrav,
Вас именно главное окно приложения интересует?
Во остальных окнах норм?
22 май 20, 21:23    [22137941]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4839
petrav,
Почему спрашивал про главное окно.
В дельфи программах только при старте и только для главного были такие эффекты.
Особенно когда поток главного окна тормозил (запрос к бд)
22 май 20, 21:33    [22137945]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50050

petrav
оно сначала получило WM_PAINT, а только потом ОС это окно выбросило бы на экран в виде
готовой картинки?

Нет, Windows так не работает.

Posted via ActualForum NNTP Server 1.5

22 май 20, 22:03    [22137959]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
petrav
Member

Откуда:
Сообщений: 2109
Dimitry Sibiryakov

petrav
оно сначала получило WM_PAINT, а только потом ОС это окно выбросило бы на экран в виде
готовой картинки?

Нет, Windows так не работает.

Тогда выходит проблема не в Qt, а в Windows? Впрочем, я думаю тут решаемые проблемы. Просто кто-то недоработал.
22 май 20, 22:15    [22137965]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50050

petrav
Тогда выходит проблема не в Qt, а в Windows?

Нет, проблема как раз таки в qt, которое работает не так, как должно работать приложение,
написанное по спекам Windows.

Posted via ActualForum NNTP Server 1.5

22 май 20, 23:06    [22137992]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
petrav
Member

Откуда:
Сообщений: 2109
Dimitry Sibiryakov

petrav
Тогда выходит проблема не в Qt, а в Windows?

Нет, проблема как раз таки в qt, которое работает не так, как должно работать приложение,
написанное по спекам Windows.

Конкретно в чём проблема?
22 май 20, 23:34    [22138005]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50050

petrav
Конкретно в чём проблема?

При открытии окна Windows посылает ему пачку сообщений, включая WM_SHOW,
WM_ERASEBACKGROUND и как последнее - WM_PAINT. Приложение (по контракту) обязано эти
сообщения должным образом обработать в кратчайшие сроки. А если оно в обработчике
сообщения захотело какой-нибудь XML с диска прочитать да отпарсить - пользователь вместо
окна наблюдает белёсое бельмо и думает, что конкретные руки, это написавшие, надо отрывать
по самую задницу, из которой они растут.

Posted via ActualForum NNTP Server 1.5

23 май 20, 00:20    [22138024]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / C++ Ответить