QT +QPainter +opengl 混合编程

C++GUI Programming with Qt 4, secondedition编程

这本书介绍了OpenGL三我也能够实现一个相似的功能吧?结果测试了晚上和一上午,才弄懂例子的原理。缓存

书上介绍Qt的绘图引擎能够和OpenGL渲染器混合在一个绘图上下文(RenderContext)的,可是须要注意的是,若是使用了这样的混合,那么咱们就须要注意正确地切换渲染上下文。虽然书上有了相关的介绍,但我以为仍是有些疏忽——稍微介绍一下就完了,咱们还不知道若是不这么作会显示不了图形。ide

首先要明确一个问题。制做这样混合的程序到底是使用便利的initializeGL()、resizeGL()、paintGL()函数仍是使用QWidget基类的构造函数、paintEvent()函数和resizeEvent()函数?我实验了下,以为混合着用是最好的。若是你们以前学过了用glut构建OpenGL程序的方式,那么我想你会赞成个人。函数

在构造QGLWidget子类的时候,个人作法是在相关初始化的代码既能够写入构造函数中,又能够写入initializeGL()函数中。随后绘制的部分我认为既然是混合OpenGL和QPainter的应用程序,那么必定要使用paintEvent()函数。由于若是使用paintGL()函数,那么只能绘制OpenGL图形了不是吗。而须要重绘的时候,既可使用resizeGL()也能够重写resizeEvent(),取决你的需求,可是按照glut的思惟,仍是重写resizeGL()比较好。不过相信你们的实力仍是本身能够写一个resizeGL()函数出来的。测试

随后为了让这OpenGL和QPainter都将图形绘制在一个渲染上下文中,须要手动关闭一些开关。下面两句代码意思就是关闭自动填充背景图片和自动交换缓存(缓冲区)。spa

setAutoBufferSwap( false );setAutoFillBackground( false );

随后注意的是在用QPainter绘制二维图形的时候,必定要用QPainterbegin()end()成员函数包裹(QPainter在构造的时候隐式调用了begin()函数),这样保证了二维图形绘制的完整性(其实Windows编程的GDIDirectXOpenGL都是这么作的)。在用OpenGL绘制三维图形以及设置OpenGL的时候,若是不是在initializeGL()resizeGL()paintGL()函数内,那么须要使用makeCurrent()将渲染上下文转为OpenGL绘制。此外在初始化OpenGL或者使用OpenGL函数进行渲染的时候,必定要记住设置顺时针为正面。即orm

glFrontFace( GL_CW );

或者在进行OpenGL渲染的时候,将OpenGL的全部位都压入堆栈,绘制完毕后弹出堆栈(例子程序VowelCube就是这么作的),使用下面两条语句包裹:图片

glPushAttrib( GL_ALL_ATTRIB_BITS );glPopAttrib( );

若是不这么作的话,那么用QPainter绘制的二维图形是没法显示的。在之前的glut编程时没有遇到这个问题的我在这里折腾了好久。因此之后但愿不要再这样出错了。get

有了这些规则,我开始研究怎样制做丰富多样的QtOpenGL程序了。it

维绘图引擎QPainter混合例子:VowelCube。让我暗自高兴,

相关文章
相关标签/搜索