В приложении, которое я пишу для Linux, у меня есть QWidget, поддерживаемый собственным окном (видео, отображаемое с помощью libmpv), на которое я хочу наложить другой (прозрачный) QWidget, который будет использоваться для рисования поверх видео.
Я попытался поместить их оба в содержащий QWidget с помощью QStackedLayout (используя режим StackAll), однако это приводит к тому, что обновления содержимого собственного окна не отражаются в приложении, даже если я установил Qt :: WA_NativeWindow на содержащем виджет, чтобы контейнер и все его дочерние элементы (оверлей и виджет видео) создаются как собственные окна.
Собственное окно корректно обновляется, если виджет наложения отсутствует, поэтому с этой целью проблем нет. Сам виджет наложения также не имеет проблем, так как он отображается только частично, как и ожидалось, покрывая область виджета видео.
В прошлом я писал нечто подобное с помощью Gtk +, где я решил это с помощью gdk_window_set_composited, что заставляет видео-виджет отображаться вне экрана, а родительский виджет уведомляется всякий раз, когда дочерний объект обновляется, чтобы он мог обрабатывать рисование дочернего содержимого самостоятельно. Тем не менее, я не смог найти что-либо равноправное в Qt, поэтому я не знаю, как этого добиться.
Использование QOpenGLWidget не вариант, поскольку у libmpv есть проблемы, когда рендеринг видео замедляется до сканирования, если текущее рабочее пространство переключается во время воспроизведения.
Задача ещё не решена.
Других решений пока нет …