Android平台QGLWidget会有重影

火花20180731 2017-10-31 09:22:47
我用的是Qt Creator for android (Qt5.7.0),在安卓平板上调试。
写了一个指北针的类MapCompass,在这个类的paintEvent中绘制表示标准地图方向的“十”字架,在周围按偏移角度offsetAngle绘制白色刻度盘和红色正北方向指针,设置了透明 setAttribute(Qt::WA_TranslucentBackground,true);

使用osgEarth加载3D地图,最终显示地图的控件是由osg实现的QGLWidget的派生类GLWidget。

在地图上添加指北针,然后为了测试指北针的转动,添加了定时器,定时设置指北针偏移角度+1。

这个程序在安卓平板上运行的时候出了问题:
在地图上出现了指北针的重影,好像是paintEvent没有清空上一次绘制的内容一样。实际上paintEvent是正常的。只是在指北针底部的QGLWidget的表面留下了指北针上一轮绘制的残影,每次绘制这些痕迹会一直停留在表明没有重绘。或者如果我在QGLWidget表面添加任何控件,然后执行某项操作将该控件hide掉,控件会被hide掉,但是控件的影像仍然停留在QGLWidget上。



我试了一下,有这两种情况:
(1) 如果我不加载地图,直接在一个空的QGLWidget上添加指北针,并进行旋转也会出现上述现象。
(2) 如果我不使用QGLWidget,而是用普通的QWidget,但是我将它设为透明setAttribute(Qt::WA_TranslucentBackground,true);也会出现上述现象。

然后我看了一下QGLWidget的源码,发现在它的构造函数中设置了setAttribute(Qt::WA_PaintOnScreen, true);
所以我的推测是,在安卓平台上,直接在主屏幕上进行绘制就会出现这种问题。

如果我获取osg中的GLWidget控件指针,并将它设置为setAttribute(Qt::WA_PaintOnScreen, false);倒是不出现残影了,但与此同时,地图也加载不了了。

不知道有什么好的解决方法?
...全文
1531 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
张小飞Official 2017-11-04
  • 打赏
  • 举报
回复
听你的描述,也就是上一次的残影没有解决。 我的建议是,在paint的时候先绘制一层当前窗口的背景,然后在背景上再做绘制。 个人网站http://www.qtdoc.cnwww.qtdoc.cn
火花20180731 2017-11-01
  • 打赏
  • 举报
回复
我个人的意见是:QWidget有两个层面,一个是foreground,一个是background,一般来说界面的重绘操作paintEvent都是在foreground上,而background上主要显示一些背景色或背景图片,而QGLWidget中把Qt::WA_PaintOnScreen设置为true后,重绘的操作被放到了主屏幕上,foreground和background都是透明的,可以看到底部主屏幕上绘制的图案,但是foreground已经不能再进行重绘操作了,而此时子控件的重绘的图形会覆盖到foreground上,所以当子控件绘制完了之后,foreground上会留下子控件的影像,但是因为foreground已经不重绘了,所以之前绘制的子控件的影像会一直留在QGLWidget的foreground上,在某些平台上可能对foreground做了特殊操作,但是andorid平台上可能有些特殊

16,203

社区成员

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

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