加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

QT OpenGL和QPainter的结合

(2013-01-03 19:59:56)
标签:

opengl

qpainter

杂谈

分类: 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 OpenGL和QPainter的结合" />
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

 

注意有时候该例编译时可能会遇到些例外错误

需注释掉构造函数中的这行:

//    setFormat(QGLFormat(QGL::SampleBuffers));

还要注意在OpenGL和QPainter结合使用时,如果开启glEnable(GL_CULL_FACE)可能会出现QPainter显示问题。如下图所示。要正确的显示QPainter,只在OpenGL绘制时开启,绘制完后关闭。

 http://s10/mw690/539d0784td262e4415139&690OpenGL和QPainter的结合" TITLE="QT OpenGL和QPainter的结合" />

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有