Qt自有一个绘图的引擎,这个引擎的核心就是QPainter,我们知道QPainter在渲染二维图形和文字有很大的优势,而OpenGL是当前流行的三维渲染器,怎样才能将两者结合起来,制作更为丰富的应用程序?《C++GUIProgramming with Qt 4,secondedition》这本书给了我们一个小的例子,不过我们还要深入地以这个例子为基础进行挖掘,配合Qt的文档,我们才能真正地了解Qt对OpenGL的封装。
演示程序下载地址:这里
源代码的下载地址:这里
这是我创建的例子截图:
这个例子使用了OpenGL、Qt资源、Qt语言家等。
简单地说,首先我用Qt原生二维渲染引擎QPainter绘制了一个背景图,随后将渲染的上下文转为OpenGL进行渲染,最后在中间显示了文字。当然我们使用了Qt语言家,可以显示任何国家的任何文字,只要机器支持该语言。
下面是我这个类的定义:
#ifndefGLWIDGET_H#define GLWIDGET_H #include <QGLWidget> #include <QPixmap> class GLWidget : public QGLWidget { Q_OBJECT public: explicit GLWidget(QWidget *parent = 0); void initializeGL( void ); void resizeGL( int width, int height ); void paintEvent( QPaintEvent *event ); // 本类的成员函数 void Init2D( void ); void Init3D( void ); void Draw2D( void ); void Draw3D( void ); void DrawCube( double length, const QColor topFace, const QColor buttomFace, const QColor leftFace, const QColor rightFace, const QColor frontFace, const QColor backFace ); void DrawTetrahedron( double length, const QColor sideFace1, const QColor sideFace2, const QColor sideFace3, const QColor buttomFace ); signals: public slots: private: enum { Cube = 0, Tetrahedron, ListCount }; GLuint m_List[ListCount]; QPixmap m_Background; float m_Angle; }; #endif // GLWIDGET_H
这里我选择了initializeGL()、resizeGL()和paintGL()三个函数进行重写。这里解释了为什么要选择这些函数。Init2D()和Draw2D()函数用来初始化与二维有关的(也就是QPixmap的初始化),Init3D()和Draw3D()函数用来初始化与三维有关的(也就是四个立方体和文字的渲染)。DrawCube()和DrawTetrahedron()函数是自己实现了绘制立方体和正三棱锥。大家可以参考一下。但是需要注意的是,进行二维图形和三维图形的混合,有可能会出现无法显示二维、无法显示三维的问题。这些问题是非常棘手的,在上一篇文章中我总结了如何避免失误。
作者:jiangcaiyang