• 14024阅读
  • 20回复

[提问]关于Qt元素透明问题 [复制链接]

上一主题 下一主题
离线ajaxhe
 
只看楼主 倒序阅读 楼主  发表于: 2011-12-29
关键词: Qt元素透明


我想实现的功能就是,在视频监控窗口的左上方,即“我要透明”这个区域内的文字透明,想问问给位大虾,有没有什么好的思路?
谢谢!

PS:
我试过在窗口的paintEvent事件中,使用drawText()函数实时绘制文字,但没有任何显示,我想可能是被视频遮盖的缘故。

离线wxj120bw

只看该作者 1楼 发表于: 2011-12-30
回 楼主(ajaxhe) 的帖子
若为了显示字 可以在左上面添加QLabel
离线ajaxhe
只看该作者 2楼 发表于: 2011-12-30
恩,谢谢!
照你说的思路,在播放窗口上加了如下代码
  1. m_infoLabel = new QLabel(tr("我要透明"));
  2. m_infoLabel->setFixedHeight(30);
  3.     m_infoLabel->setAttribute(Qt::WA_TranslucentBackground, true);
  4.     QVBoxLayout *layout = new QVBoxLayout();
  5.     layout->setContentsMargins(0,0,0,0);
  6.     layout->addWidget(m_infoLabel);
  7.     layout->addStretch();
  8.     showWidget->setLayout(layout);
其中showWidget就是播放窗口
效果如下:
播放前:

播放中:

停止播放后:


从运行效果上看,视频在播放的时候,把label给遮盖了。
对了,我的视频播放是用DirectDraw实现的,在播放的时候将showWidget窗口的句柄传给DirectDraw,由DirectDraw来负责视频帧的显示。

离线cwc1987

只看该作者 3楼 发表于: 2011-12-30
被视频遮了,就最后绘制text应该就可以了吧
离线uidab

只看该作者 4楼 发表于: 2011-12-30
回 2楼(ajaxhe) 的帖子
记得DirectDraw可以给加文字,原来同事用VC做过。
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线voidbroken

只看该作者 5楼 发表于: 2011-12-30
窗口中内容的绘制由directdraw来负责,那你再用窗口的内部paint来绘制内容,这两个如何协调?
应该是楼上说的,用directdraw来全面负责吧
离线ajaxhe
只看该作者 6楼 发表于: 2011-12-30
回 4楼(uidab) 的帖子
恩,DirectDraw是可以完成这个功能。
目前纠结的问题是:底层的DirectDraw是编译好的lib库,我现在无法修改。
离线uidab

只看该作者 7楼 发表于: 2011-12-30
回 6楼(ajaxhe) 的帖子
那你试试用qpainter  ,同时利用qpixmap,画一个透明层,然后写东西!
思路是这样。
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线jingwei
只看该作者 8楼 发表于: 2011-12-30
我也被这个问题困惑 求教
离线米饭拌面

只看该作者 9楼 发表于: 2011-12-30
能问下你这个视频是用什么控件显示的么? QGraphicsView?
QQ:32336134
离线ajaxhe
只看该作者 10楼 发表于: 2011-12-30
回 9楼(米饭拌面) 的帖子
就是一个Qwidget,把这个转换成HWND后传给DirectDraw来显示视频帧
离线ajaxhe
只看该作者 11楼 发表于: 2011-12-30
回 7楼(uidab) 的帖子
恩,谢谢。那这个painter放在哪里重绘的好呢?

我创建了一个定时器如下
  1. m_timer = new QTimer(this);
  2.     connect(m_timer, SIGNAL(timeout()), this, SLOT(repaint()));
  3.     m_timer->start(10);
每个10毫秒触发一个paintEvent事件,paintEvent()函数如下:
  1. void MediaVideoWindow::paintEvent(QPaintEvent *event)
  2. {
  3.     QPainter painter(this);
  4.     
  5.     QPixmap background("./background.jpg");
  6.     painter.drawPixmap(10, 10, background);
  7. }
视频窗口闪烁的得和厉害。

我能想的方法都试了,还是不行啊

离线bullman975
只看该作者 12楼 发表于: 2012-01-31
就是一个Qwidget,把这个转换成HWND后传给DirectDraw来显示视频帧

請問一下您是如何傳的?  用到了哪個關鍵函式呢?
想利用DirectDraw畫張圖在一個 QWidget 上卻怎麼也畫不上去
有範例能參考嗎?

謝謝
离线ajaxhe
只看该作者 13楼 发表于: 2012-02-15
回 12楼(bullman975) 的帖子
我之前有写一个测试程序,你留个邮箱,我发给你
离线zzjin

只看该作者 14楼 发表于: 2012-02-16
我觉得解决方法是在这个widget外面再套一层widget作为容器来包含directshow的显示widget和要在上面覆盖的qlabel层.而不是把qlabel直接放在要传递的HWND上.
具体来说:mainwidget{"widget"=>directshow,"qlabel"=>提示}的关系.再去设置两个子widget的z关系
离线dxfans

只看该作者 15楼 发表于: 2012-02-16
回 楼主(ajaxhe) 的帖子
楼主可以这样做,将窗口划分即可:将文本显示作为一个窗口部件,由Qt处理;将视频显示作为一个窗口部件,由DirectDraw处理;这样就各自不影响了。。。
离线ajaxhe
只看该作者 16楼 发表于: 2012-02-23
回 14楼(zzjin) 的帖子
恩,有道理,之后我这样修改过,窗口关系如下:
mainwidget{"widget"=>directshow,"drawWidget"=>提示};
其中drawWidget自己重写了一个QWidget子类,
问题是z关系如何设置呢?
我查了些Qt的文档,没有找到有关改变Z轴的函数。

谢谢~
离线ajaxhe
只看该作者 17楼 发表于: 2012-02-23
回 15楼(dxfans) 的帖子
恩,是分开做的,但和在一起的时候还有问题
离线zzjin

只看该作者 18楼 发表于: 2012-02-26
回 16楼(ajaxhe) 的帖子
你可以试试raise和lower两个qwidget的函数....
离线xuweistudy
只看该作者 19楼 发表于: 2012-02-26
回 9楼(米饭拌面) 的帖子
QWidget,QLabel....都可以,在paintEvent里处理,也可以用winId(),在窗口句柄上绘制
离线rcyboom

只看该作者 20楼 发表于: 2012-02-26
如果opengl或者DX渲染不是你可控的话,可以先将其渲染到内存图像,然后使用qpainter在上面画图,然后在绘制到窗体上;
如果是可控的话就简单了,直接在其绘制函数中最后调用qpainter绘制即可(这个技能官方关于qt opengl的白皮书上有讲过,也有demo),不过这个方法肯定的是在opengl下有效,dx就没试过也没听过了。
快速回复
限100 字节
 
上一个 下一个