我用的是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);倒是不出现残影了,但与此同时,地图也加载不了了。
不知道有什么好的解决方法?