之前发现QT中的OpenGL初始化没有按照所想的进行,发现是因为没有调用初始化函数,当时调用了update,然而没有用。之后发现qt的update函数对OpenGL显示存在缺陷,如果使用updateGL函数又会产生未知错误,导致程序崩溃。但是在实际开发的过程中需要通过许多控件对OpenGL的图像进行更新显示,此时不能使用的update就成了很大的问题。我尝试了很多方法,包括使用updateGL,repaint等等方法,都没有达到希望的效果。
之后在查看OpenGL使用glut显示的时候发现glut采用的是消息循环,也就是一个无限循环不停的重新绘制,所以我尝试在QT中添加了一个计时器QTimer,在构造其中添加了以下代码
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(50);
运行后发现之前不刷新的问题得到了解决,虽然切换界面的时候发现有闪屏的现象,但是界面中的OpenGL显示已经可以正常显示。
还有一些文章写个关于QGraphicsView的刷新问题,此处我没有使用QGraphicsView。可能还有其他的解决方法,但是目前我只成功了这一个。
经过之后的测试得出,如果不是用timer进行刷新,则手动调用update()均没有作用,但是使用timer隔10毫秒进行第二次刷新的时候就可以正常显示。所以推断刷新需要一定时间间隔,如果连续调用update时间间隔太短update不起作用。update本身不会直接重绘,有时需要调用多次update才能完成一次重绘,连续调用update也会导致失灵。
update刷新子控件的时候,会将刷新命令加入队列,然后等到回到主线程进行绘图的时候才会调用,个人推测update需要一定的时间间隔,不论使用sleep或者timer,只要满足了时间间隔的需要就可以正常绘制图像。
这里的新解决可以查看 Qt——无法实时刷新问题,这里面的内容可以解决。