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

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

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

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

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

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

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

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

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

Posted via ActualForum NNTP Server 1.5

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

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

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

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

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

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

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

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

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

Откуда:
Сообщений: 820
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

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

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

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

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

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

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

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

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

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

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

Posted via ActualForum NNTP Server 1.5

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Posted via ActualForum NNTP Server 1.5

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

Откуда:
Сообщений: 2105
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

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

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

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

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

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

Posted via ActualForum NNTP Server 1.5

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

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

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

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

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

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

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

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

Posted via ActualForum NNTP Server 1.5

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

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

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

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

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

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

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

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

Posted via ActualForum NNTP Server 1.5

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

Откуда: loopback
Сообщений: 46496
Да. Большинство OS GUI - однопоточные.
Возможно IOS как то порешали этот вопрос,
Но я не специалист в них вообще. Пускай знающие откомментируют.
23 май 20, 09:28    [22138068]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
petrav
Member

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

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

При открытии окна Windows посылает ему пачку сообщений, включая WM_SHOW,
WM_ERASEBACKGROUND и как последнее - WM_PAINT.

Вот это как раз и плохо.

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

По вашим рассуждениям выходит так, что Qt унаследовало архитектуру X-Windows, а в этой архитектуре необходимо в сообщении OnPaint обязательно парсить XML файлы или ещё что-то такое делать. Вот Qt портировали на Win, а от этой архитектурной особенности избавится не получилось. :)

Ну и я, конечно, в OnPaint парсю не только XML, но ещё и json!
23 май 20, 19:16    [22138286]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4785
petrav
Вот это как раз и плохо.

чем?
Вы на винду не гоните волну)))
а) нет фактов пока
б) paint винда никогда не гарантировала
с) есть ещё WM_ACTIVATE WM_SHOWWINDOW
23 май 20, 19:35    [22138291]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
Dimitry Sibiryakov
Member

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

petrav
Ну и я, конечно, в OnPaint парсю не только XML, но ещё и json!

Описанные симптомы соответствуют, виновный сознался, дело закрыто.

Posted via ActualForum NNTP Server 1.5

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

Откуда: loopback
Сообщений: 46496
А кто нибудь из присуствующих разрабатывал под Gnome/GTK+?
23 май 20, 22:47    [22138370]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4785
mayton
Gnome/GTK+
я под астрой
23 май 20, 22:54    [22138371]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
petrav
Member

Откуда:
Сообщений: 2105
PetroNotC Sharp
mayton
Gnome/GTK+
я под астрой

Astra-Linux-ФСБ ?
23 май 20, 22:57    [22138374]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
mayton
Member

Откуда: loopback
Сообщений: 46496
Там есть API для веб-камер или для стриминг-трансляций? Ну вобщем в этом направлении.
23 май 20, 22:57    [22138375]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
egorych
Member

Откуда: и зачем;
Сообщений: 4784
Dimitry Sibiryakov

petrav
Ну и я, конечно, в OnPaint парсю не только XML, но ещё и json!

Описанные симптомы соответствуют, виновный сознался, дело закрыто.
всё же дело не в Qt, а в руках подозреваемого))
24 май 20, 01:16    [22138401]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4785
mayton
Там есть API для веб-камер или для стриминг-трансляций? Ну вобщем в этом направлении.
ну, реально таких задач не было.
Но так как основа дебиан, то
https://www.google.com/search?q=debian web camera&oq=debian web camera&aqs=chrome..69i57j0l2.10314j0j8&client=tablet-android-huawei&sourceid=chrome-mobile&ie=UTF-8
И напр. ссыль
https://wiki.debian.org/Webcam
24 май 20, 10:18    [22138439]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
petrav
Member

Откуда:
Сообщений: 2105
Del.

Сообщение было отредактировано: 24 май 20, 10:47
24 май 20, 10:48    [22138442]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
mayton
Member

Откуда: loopback
Сообщений: 46496
PetroNotC Sharp
mayton
Там есть API для веб-камер или для стриминг-трансляций? Ну вобщем в этом направлении.
ну, реально таких задач не было.
Но так как основа дебиан, то
https://www.google.com/search?q=debian web camera&oq=debian web camera&aqs=chrome..69i57j0l2.10314j0j8&client=tablet-android-huawei&sourceid=chrome-mobile&ie=UTF-8
И напр. ссыль
https://wiki.debian.org/Webcam

Из этого комплекта Debian для Ubuntu я попробовал установить Cheese.
Уродское приложение с нулевым количеством настроек. Совершенно непонятно
зачем оно вообще было создано. Видимо просто как теч-демо или проверка
готовности камеры к работе.

Далее попробую VLC как такой универсальный комбайн для всего.
24 май 20, 11:10    [22138451]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4785
mayton,
VLC плеер бесплатно
https://www.videolan.org/vlc/download-debian.html
и VidBlaster (~300.000 рублей).
24 май 20, 11:37    [22138461]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
mayton
Member

Откуда: loopback
Сообщений: 46496
Да VLC видит вебкамеру. Надо теперь попробовать постримить самому себе.
24 май 20, 14:26    [22138539]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение QWidget::paintEvent() и мерцание при старте  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4785
mayton,

https://habr.com/ru/company/singularis/blog/343362/
24 май 20, 14:37    [22138544]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / C++ Ответить