Видео Мерцает При Использовании Виджета Qt И Directshow

В настоящее время я разрабатываю видеоплеер для Windows. И я на некоторое время «застрял» на задаче — после переключения на Qt видео в плеере начинает мигать и пропадать (см.

видео).

Попытки переопределить QWidget::paintEvent невозможны из-за того, что Qt рисует ( https://qt-project.org/doc/qt-4.8/qwidget.html#autoFillBackground-prop ) перед QWidget::paintEvent. Попытка переопределить WM_PAINT и WM_ERASEBACKGOUND в QWidget::winEvent также не удалась, поскольку краскаEvent может вызываться не только из WM_PAINT, но и другими сервисами, использующими неизвестный мне алгоритм.

Поэтому ниже я дам решение, как я вышел из этой ситуации.

Итак, решение: Я решил не изобретать велосипед, а использовать нативные виджеты вместе с Qt. Сам родной виджет будет находиться внутри QWidget. Схематически это можно представить в окне плеера следующим образом:

Видео мерцает при использовании виджета Qt и Directshow

Сначала мы создаем обработчик окна.

Он позаботится о регистрации класса окна и пересылке сообщений виджетам.

Также необходимо запретить QApplication обрабатывать сообщения для собственных виджетов.

В нашем проекте используется libqxt, поэтому нам нужно добавить фильтр с помощью QxtApplication::installNativeEventFilter. Другой вариант — переопределить QCoreApplication::winEventFilter. Для начала я написал класс WindowProcMapper для сопоставления HWND с объектом.

роднойвиджетимпл.

ч

   

namespace Native {

Теги: #Работа с видео #видео #winapi #Qt #видеоплеер #directshow
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.