若该文为原创文章,未经允许不得转载
原博主博客地址:https://blog.csdn.net/qq21497936
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/94635225
目录
补充(2019年7月18日):共父类的子控件(与QOpenGLWidget兄弟控件)无法透明
补充(2019年7月22日):Qt场景视图兼任OSG叠加窗口的方式是不能透明的(QGraphicsView的背景是OSG)
关于 QGLWidget和QOpengGLWidget透明相关问题 的解决方法
需求
白板需要打开PPT,打开PPT后在上面仍然存在白板,很自然想到窗口透明,白板视图场景采用的是OpengGL窗口(提高效率,效果也比QWidget窗口好)。
相关博客
《Qt开发笔记:QGLWidget、QOpenGLWidget详解及区别》
测试不同方案可达到的三种效果
- QOpengGLWidget和QGLWidget测试是黑的:设置背景色不透明(后续:都显示,是QGLWidget渲染导致都无法透明)
- QOpengGLWidget测试完全透明:鼠标都穿透:设置背景色透明,重写painterEvent,设置stylesheet
- QGLWidget测试是绘图不断叠加:鼠标不穿透,但是刷新A1后,刷新叠A2,再刷新叠A3,不断叠加
解决方法
改回QWidget,要解决该问题需要查看qt源码QOpenGL和QGraphicsView的实现,暂时没有实现。
补充(2019年7月18日):共父类的子控件(与QOpenGLWidget兄弟控件)无法透明
尝试一:
与之前的视频播放器上面需要半透明控件一样,估计是传句柄绘制
尝试二(无父子兄弟关系):
补充OPENGL渲染窗口上可以半透明当前尝试可行的唯一方法
补充(2019年7月22日):Qt场景视图兼任OSG叠加窗口的方式是不能透明的(QGraphicsView的背景是OSG)
下面的可以(osg作为view的北京,场景中addwidget)
补充(2019年08月06日)
发现Qt的OpenGl可以半透明,而OSG无法半透明,于是深入进行对比测试,测试验证过程如下:
- 使用QGLWidget渲染,上层qt控件无法透明(设置透明一定有黑色底框,与设置透明属性没有关系)
- 使用QOpenGLWidget渲染,上层qt控件无法透明(后解析:是工程同时渲染QGLWidget和QOpenGLWidget导致)
- 不设置父类,通过布局将两者加入QWidget布局中,无法透明(后解析:两种都添加)
- 不设布局,直接设置父类可透明(后解析:一种一种添加,单独渲染QOpenGLWidget能透明)
- 在osg工程中,单独使用QGLWidget空窗口(上浮不能透明),单独使用QOpenGLWidget空窗口(上浮能透明)
- 在osg工程中,不舍布局只设置父类,无法透明(后解析,一半使用QGLWidget,一半使用QOpenGLWIdget)
- osg工程与之前4的情况,最大区别在于是否有ui设计文件(后解析:不是该问题)
- 将能透明的前4种的带ui的累放入osg工程中,透明(后解析:是使用QOGLWidget导致的上浮控件不能透明)
- 进一步确认,是因为渲染的时候如果渲染加入了QGLWidget则整个窗口在opengl上的上浮控件渲染都不会透明
- 再次在osg中确认,是QGLWidget导致的无法上浮半透明控件
- 进一步确认,带父类与不带父类与透明无关,是QGLWidget若在渲染窗口中,则其他opengl渲染窗口上浮控件都无法透明。
至此解决,强力推荐使用QOpenGLWidget而不要使用QGLWIdget。
原博主博客地址:https://blog.csdn.net/qq21497936
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/94635225