在qt+mplayer播放视频上层设置半透明窗体,为什么窗体透明不了,变成黑色了

小猫儿钓鱼 2013-06-06 02:25:40
我用的是Qrocess调用mplayer.exe播放视频文件,在win7环境下,单播放视频是成功的,但我想在视频的上层放些控件来控制视频的播放(play,paue,stop,sound等按钮),像很多播放器一样能让控制按钮悬浮在视频上,具体是先放了一个Label,设置Label为透明,再在Label上放这些控制按钮,按理说能透过Label没有按钮的部分看到视频,可现在Label没有按钮的部分全成了黑色,当我把视频部分换成图片时,一切又都正常,为什么背景是视频时会变成黑色,要怎么解决这个问题?请高手指定迷津 谢谢
...全文
2814 33 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
MKNDG 2015-12-31
  • 打赏
  • 举报
回复
用setAttribute(Qt::WA_NoSystemBackground,false);以及StyleSheet去实现窗口圆角与半透明就可以显示了。
我是传奇zhg 2015-10-09
  • 打赏
  • 举报
回复
多少年过去了,还是没人解决吗?
a294130128 2015-07-27
  • 打赏
  • 举报
回复
多少年过去了,还是没人解决吗?
yaokaei 2015-06-15
  • 打赏
  • 举报
回复
哥们也遇到这个问题了。 视频给widget绘制,在上面加一层透明的窗体和半透明的图片后,半透明的图片最后覆盖到视频上面是黑色的, 但是覆盖在一张静态图片上面确实可以半透过去。 是不是覆盖在上面的widget必须继承GLWidget才行啊? 各位大神有没有解决啊,给一个思路
dwjmantou 2015-01-23
  • 打赏
  • 举报
回复
我现在用vlc也遇到这样的问题,大概猜测原因是,句柄传递给了视频播放组件,他会拦截所有windows消息,按照windows的消息传递机制,如果子控件处理过了消息,那么消息便不会向其父控件传递了,所有paintevent之类的的事件根本不能激发,所以即使在qt看来存在子控件,这些控件也没有绘制机会的。如果将透明图层弄得和视频播放窗口同级的话,在qt中,这个图层的确透明,那么决定他的颜色就是他的父控件,也就是透明涂层和视频播放窗口图层共同的父窗口,也就是楼主的黑色了。现在貌似说要重新编译库函数,重新发消息。
fansgq 2014-08-04
  • 打赏
  • 举报
回复
参考box的例子吧,用QGraphicsView可是实现
jinjianxinxh 2014-07-23
  • 打赏
  • 举报
回复
建议楼主看看smplayer的代码
ison_jaro 2014-07-16
  • 打赏
  • 举报
回复
我也遇到过这样的问题,后来解决的方法是将视频上面的控件设置为Tooltip + 透明背景。

setAttribute(Qt::WA_TranslucentBackground, true);
setWindowFlags(Qt::FramelessWindowHint | Qt::Tool);

另外,控件设为tooltip之后,它的坐标就不再跟随父窗口而是全局。因此需要对它的坐标做特殊的处理。
最终的效果(在视频上覆盖一层透明控件,根据鼠标操作在上面画虚线框):
lingdhox 2014-07-15
  • 打赏
  • 举报
回复
你的做法我也尝试过, 最终以失败而告终. 我最后的做法是, 把视频帧交给widget绘制. windows下的透明是通过layered window实现的. Qt的透明窗口也是如此, 属于directui. 整个窗口只有一个winId(windows下即HWND). 但是 opengl和directx都需要一个handle来绘制渲染. 而Qt的窗口中, 如果某个子Widget获取了winid. 则打破"directui". 窗口中的所有widget都会拥有handle. 因此透明窗口是无法单独把某个widget交给opengl或direcxt渲染的.
小猫儿钓鱼 2014-07-11
  • 打赏
  • 举报
回复
引用 16 楼 dowithsmiles 的回复:
之前碰到过,是渲染机制的原因,DirectX出现此问题而OpenGL没有。当时讲述这个原因的帖子找不到了,等找到了再帖上来。
不知大神找到贴子没,贴出来分享下啊,感激不尽
.千山. 2014-03-25
  • 打赏
  • 举报
回复
请教一下,我最近想试试mplayer。结果自己写个小程序,想用frame控件播放,但是没有反应啊。下面代码各位帮忙看看。我是Win7 64位的系统,哪位成功播放了,请指教、、

void Widget::on_Play_clicked()
{
    if(playingfile.isEmpty())
    {qDebug()<<"playingfile  fialed";return;}
    QStringList args;
    args<<"-slave";
    args<<"-quiet";
    args<<"-wid "<<QString::number(ui->frame->winId());          //获取窗体ID;
    args<<playingfile;
    player_process=new QProcess(this);
     connect(player_process,SIGNAL(readyReadStandardOutput()),this,SLOT(readFromStdout()));
    player_process->setProcessChannelMode(QProcess::MergedChannels);
    player_process->start("D:/mplayer_lite_r34577/mplayer/mplayer.exe",args);
    if(!player_process->waitForStarted(2000))
       QMessageBox::warning(this,"warning","Fialed!");
    player_process->write("get_time_length\n");
}
miaotouyang 2014-03-22
  • 打赏
  • 举报
回复
关注,楼主是X86平台么? 我也同样问题,不好解决,有人说这和硬件有关系。 富士通有款ARM9可以硬件完成插帧功能,实现视频+透明窗口。 不过我现在用的是X86,flash播放+透明,还没有解决。
小猫儿钓鱼 2014-03-17
  • 打赏
  • 举报
回复
静等大神来指导
cuccs_ion 2014-01-16
  • 打赏
  • 举报
回复
引用 14 楼 fansgq 的回复:
qt上使用openGL把视频帧当做纹理渲染,才可以实现半透效果.
这个该如何做设置呢?
hopevc 2013-12-14
  • 打赏
  • 举报
回复
有没有解决啊,关注
彩阳 2013-12-14
  • 打赏
  • 举报
回复
你们说的这些,又不贴一张图出来,怎么行呢?
windywater119 2013-10-20
  • 打赏
  • 举报
回复
之前碰到过,是渲染机制的原因,DirectX出现此问题而OpenGL没有。当时讲述这个原因的帖子找不到了,等找到了再帖上来。
dianpozi 2013-10-16
  • 打赏
  • 举报
回复
关注啊,正好遇到这个问题。。。
fansgq 2013-09-11
  • 打赏
  • 举报
回复
qt上使用openGL把视频帧当做纹理渲染,才可以实现半透效果.
sourire_will 2013-09-06
  • 打赏
  • 举报
回复
顶,我也碰到和楼主一样的问题,期待大神解决
加载更多回复(12)

16,816

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧