pyqt播放视频不能显示
pyqt本来播放视频能显示,后来不能显示,最终排查,找到原因:
self.setAttribute(Qt.WA_TranslucentBackground, True)
参考:http://blog.sina.com.cn/s/blog_ec6748cf0101hg2t.html
Qt中使用WA_TranslucentBackground时的出现的bug解决方案
四、总结
当使用Qt窗口的WA_TranslucentBackground或WA_TranslucentBackground属性时,在Qt的4.6.2, 4.7.0, 5.1.0版本下,可能会造成窗口最小化后恢复显示时,不产生paint事件。该Bug在Qt5.1.1修复。
为了正常处理代码,可使用winEvent事件,接收系统发送的WM_WINDOWPOSCHANGED消息。即窗口最小化后恢复显示可以触发自己的处理代码。
一、问题的出现
用Qt制作窗口阴影边框的时候,需要对背景窗口做透明处理。代码如下:
setAttribute(Qt::WA_TranslucentBackground, true);
在设置该属性时,所有背景窗口上的子窗口均被设置该属性,即所有子窗口(控件除外)也将透明。
在项目中,我们需要为IE插件提供一个窗口wndIE,以供IE插件在wndIE上绘制内容。但由于背景窗口wndShadow被设置为透明属性,所以wndIE也是透明的,便不能正常显示IE插件的内容。
我们找到的能够起作用的解决办法就是,设定wndIE的父窗口为NULL,就不会受到wndShadow透明属性的影响,以便用来显示IE插件的内容。同时通过坐标设定,让wndIE的显示位置与wndShadow同步,以及用raise()函数将wndIE窗口显示在wndShadow前面。
但在测试中发现,在窗口Z轴顺序切换的时候,有时会发生wndIE不能正常显示的问题。即在随意切换窗口Z顺序时,在切换回项目程序时,wndShadow会显示,而wndIE不会显示。
二、正常的解决思路
想到无论什么情况下,只要一个窗口被遮挡后重新完整显示,必然会有paint事件的产生。那么只要在paint事件发生时,强制让wndIE窗口显示出来就可以解决问题。
该思路确实产生了效果,但是在个别的情况下不起作用。
三、Qt5.1.1以下版本的Bug
代码跟踪发现,窗口Z轴顺序切换回wndShadow,Bug发生时Paint函数没有被调用,正常时Paint函数会被调用。
经过查找资料发现,是WA_TranslucentBackground属性的一个Bug。官网声明连接:
https://bugreports.qt-project.org/browse/QTBUG-17548
也就是设定了WA_TranslucentBackground属性后,在窗体最小化后还原的时候可能会没有paint事件,也就不能调用raise()让wndIE窗口显示在wndShadow窗口前面。
为了在窗口重新显示时,正常调用raise()函数。接收wndShadow的winEvent事件。可以接收到系统发来的WM_WINDOWPOSCHANGED消息,也就是当Z轴窗体顺序切换回wndShadow时,可以产生winEvent事件,也就可以调用raise()函数,强制显示wndIE窗口。代码如下:
bool wndShadow::winEvent(MSG *message, long *result)
{
if(message->message == WM_WINDOWPOSCHANGED)
{
// 处理代码
winIE->raise();
}
return false; // 返回false结束系统的默认处理
}
文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/jacke121/article/details/78777981
- 点赞
- 收藏
- 关注作者
评论(0)