В настоящее время я разрабатываю видеоплеер для 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. Схематически это можно представить в окне плеера следующим образом:
Сначала мы создаем обработчик окна.
Он позаботится о регистрации класса окна и пересылке сообщений виджетам.
Также необходимо запретить QApplication обрабатывать сообщения для собственных виджетов.
В нашем проекте используется libqxt, поэтому нам нужно добавить фильтр с помощью QxtApplication::installNativeEventFilter. Другой вариант — переопределить QCoreApplication::winEventFilter. Для начала я написал класс WindowProcMapper для сопоставления HWND с объектом.
роднойвиджетимпл.
ч
Теги: #Работа с видео #видео #winapi #Qt #видеоплеер #directshownamespace Native {
-
Образовательная Школа
19 Oct, 24 -
Хорошего Праздника
19 Oct, 24 -
Расшифрован Механизм In-App App Store
19 Oct, 24 -
«Кризисная» Rumetrics
19 Oct, 24 -
Загрузите И Поделитесь
19 Oct, 24 -
Собственный Движок Webgl. Артикул №1. Холст
19 Oct, 24