Я в настоящее время разрабатываю видеоплеер.
Графический интерфейс как самый верхний слой написан на QML.Он должен быть прозрачным для нижних слоев.Содержит элементы управления, некоторые списки и т. Д. Отображается с помощью QDeclarativeView
.
Описание
QDeclarativeView *upperLayer = new QDeclarativeView(this);
upperLayer->setSource(QUrl("/home/projects/QtVideo/qml/videoControl.qml"));
upperLayer->setStyleSheet(QString("background: transparent");
upperLayer->setResizeMode(QDeclarativeView::SizeRootObjectToView);
uperLayer->showFullScreen();
Слой под ним является QWidget: я использую libvlc для отображения видеоконтента в этом виджете.
Причина: я получаю MPEG-TS, который не может быть декодирован по фонону, афаик.Поэтому мне нужен libvlc для декодирования входящего потока *.ts
и вывода вывода на дисплей.
QWidget *lowerLayer = new QWidget(this);
lowerLayer.setGeometry(QString("background: red"));
QUrl* url = new QUrl("file:///home/projects/QtVideo/video.ts");
libvlc_instance_t*vlcObject;
libvlc_media_t*vlcMedia;
libvlc_media_player_t*vlcPlayer;
vlcPlayer = NULL;
if(vlcObject = libvlc_new(argc, argv)) == NULL)
{
printf("Not able to initialize";
exit(1);
}
if(vlcPlayer && libvlc_media_player_is_playing(vlcPlayer))
{
libvlc_media_player_stop(vlcPlayer);
}
vlcPlayer = libvlc_media_player_new(vlcObject);
vlcMedia = libvlc_media_new_location(vlcObject, url.toString().toUtf8().constData());
libvlc_media_player_set_media(vlcPlayer, vlcMedia);
#if defined(Q_OS_MAC)
libvlc_media_player_set_nsobject(vlcPlayer, lowerLayer->winId());
#elif defined(Q_OS_UNIX)
libvlc_media_player_set_x_window(vlcPlayer, lowerLayer->winId());
#elif defined(Q_OS_WIN)
libvlc_media_player_set_hwnd(vlcPlayer, lowerLayer->winId());
#endif
libvlc_media_player_play(vlc_player);
Оба элемента, QDeclarativeView
и QWidget
, встроены в QMainWindow
,LowerLayer, созданный до upperLayer
, upperLayer
Прозрачный для lowerLayer
.
Проблема:
Пока нижний слой отображает статические элементы, такие как изображение или некоторые цветныеформы, все работает отлично, полная прозрачность и функциональность.
Как только я начинаю отображать видео, такое как описанное *.ts
, используя libvlc ИЛИ какое-то случайное видео, используя Phonon::VideoPlayer
, частиupperLayer
, расположенные над видео частями lowerLayer
, отображаются цветом lowerLayer(default: gray)
, части upperLayer
, расположенными над частями lowerLayer
или другими, которые не содержат видеоэлементовотображаются в правильном поведении.
Вопрос:
Есть ли возможность и, если да, то как сделать верхний слой прозрачным, даже если воспроизводится видео?