QT OpenGL和QPainter的结合

标签:
openglqpainter杂谈 |
分类: QT |
QT中可以在QGLWidget上使用OpenGL命令绘制一个三维场景,也可以使用QPainter在QGLWidget上绘制二维图形。如下图Vowel Cube例子。详见 Jasmin Blanchette写的C++ GUI Programming with Qt 4, second edition
http://s5/mw690/539d0784td2613b7f9a44&690OpenGL和QPainter的结合" TITLE="QT
VowelCube类派生自QGLWidget,使用QPainter绘制背景的渐变,然后使用OpenGL调用绘制立方体,接着使用renderText()绘制立方体角上的8个字母,最后使用QPainter和QTextDocument绘制图例。用户可以单击并拖动鼠标来旋转立方体,并且可以使用鼠标滚轮进行放大和缩小。
为有利于更新OpenGL的帧缓存,不使用QGLWidget的高级函数initialGL()、resizeGL()、paintGL(),而是采用QWidget的paintEvent().
可以在构造函数中调用createGradient()设置用来填充背景的QRadialGradient,并且调用createGLObject()创建OpenGL立方体对象,一遍稍后迅速重绘场景。构造函数中创建的OpenGL列表用来保存绘制的立方体的边,可以在析构函数中通过调用glDeleteLists()删除。
在paintEvent中,像普通的QWidget一样来设置QPainter,然后绘制背景、立方体以及图例。
绘制背景就是使用合适的画刷调用drawRect().本例中就是构造函数中创建的QRadialGradient。使用OpenGL绘制立方体时必须保存修改的OpenGL状态,包括属性、投影矩阵和模式视图矩阵。最后在适当的时候再恢复它。
本例的paintEvent实现具有以下通用模式:
1.创建一个QPainter
2.使用QPainter绘制背景
3.保存OpenGL状态
4.使用OpenGL操作绘制场景
5.恢复OpenGL状态
6.使用QPainter绘制前景
7.销毁QPainter
注意有时候该例编译时可能会遇到些例外错误
需注释掉构造函数中的这行:
//
还要注意在OpenGL和QPainter结合使用时,如果开启glEnable(GL_CULL_FACE)可能会出现QPainter显示问题。如下图所示。要正确的显示QPainter,只在OpenGL绘制时开启,绘制完后关闭。