私は現在、ビデオプレーヤーを開発しています。
最上位層の GUI は 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 を受信しています。*.ts
したがって、着信ストリームをデコードして出力をディスプレイに表示するには、libvlc が必要です。
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
upperLayer
upperLayer
lowerLayer
問題:
lowerLayer が画像や色付きの図形などの静的要素を表示している限り、すべてが正常に機能し、完全な透過性と機能性を備えています。
*.ts
libvlc を使用して説明したビデオや、 を使用したランダムなビデオなどのビデオの表示を開始するとすぐにPhonon::VideoPlayer
、upperLayer
のビデオ部分の上にある の部分がlowerLayer
の色で表示され、配置されているlowerLayer(default: gray)
の部分upperLayer
が上記のlowerLayer
ビデオ要素を含まない、またはその他の部分は、正しい動作で表示されます。
質問:
ビデオが再生されている場合でも、upperLayer を透明にする可能性はありますか?