Qt OpenGL教程
Qt OpenGL的准备工作
第三课:上色 第四课:旋转
第一课:创建一个OpenGL窗口 第二课:你的第一个多边形 第五课:向三维进军 第六课:纹理映射
第七课:纹理滤波、光源和键盘控制 第八课:融合
第九课:在三维空间中移动位图
第十课:载入一个三维世界并在其中移动 第十一课:旗的效果(波动纹理) 第十二课:显示列表
第十三课:位图字体 第十四课:轮廓字体
第十五课:使用纹理映射的轮廓字体 第十六课:看起来很棒的雾
因为本教程是从NeHe的OpenGL教程迁移过来的,代码变为Qt实现的。所以有的课程一时还没有实现成功,所以可能有些教程是跳跃的。
因本人时间有限,所以难免有错误出现,如果您发现了这些错误,或者有什么建议,请来信指教,谢谢。
Qt OpenGL的准备工作
因为Qt存在很多版本,另外它支持的平台也很多,到目前为止我只实验了几个组合,所以就先把这些列出来吧,欢迎大家补充。
Unix/X11
Linux
Qt:自由版或者企业版都支持OpenGL模块,而专业版则不能。我现在使用的是3.1.0自由版和企业版。
gcc:编译器。我现在使用的是3.2。
X:Linux下的图形环境。我现在使用的是4.2.0。 Mesa:自由的OpenGL。我现在使用的是5.0。
Windows
Qt:企业版支持OpenGL模块,而专业版则不能。我现在使用的是3.1.0企业版。 Microsoft Visual Studio:编译器。我现在使用的是6.0。
创建一个OpenGL窗口
我假设您对Qt编程已经有了一定的了解,如果您还没有熟悉Qt编程,建议您先学习一下Qt编程的基础知识。
Qt中已经包含了OpenGL模块,具体情况您可以参考Qt OpenGL模块的相关内容。
NeHeWidget类
这就是我们继承QGLWidget类得到的OpenGL窗口部件类。 (由nehewidget.h展开。) #include
class NeHeWidget : public QGLWidget {
Q_OBJECT
因为QGLWidget类被包含在qgl.h头文件中,所以我们的类就需要包含这个头文件。Q_OBJECT是Qt中的一个专用的宏,具体说明请参见Qt的文档。 public:
NeHeWidget( QWidget* parent = 0, const char* name = 0, bool fs = false ); ~NeHeWidget();
protected:
void initializeGL(); void paintGL();
void resizeGL( int width, int height );
因为QGLWidget类已经内置了对OpenGL的处理,就是通过对initializeGL()、paintGL()和resizeGL()这个三个函数实现的,具体情况可以参考QGLWidget类的文档。
因为我们的这个Qt OpenGL教程取材于NeHe OpenGL教程,所以这里就用这个NeHeWidget类来继承QGLWidget类来使用相关OpenGL的功能。
initializeGL()是用来初始化这个OpenGL窗口部件的,可以在里面设定一些有关选项。paintGL()就是用来绘制OpenGL的窗口了,只要有更新发生,这个函数就会被调用。resizeGL()就是用来处理窗口大小变化这一事件的,width和height就是新的大小状态下的宽和高了,另外resizeGL()在处理完后会自动刷新屏幕。 void keyPressEvent( QKeyEvent *e ); 这是Qt里面的鼠标按下事件处理函数。 protected:
bool fullscreen;
用来保存窗口是否处于全屏状态的变量。 };
(由nehewidget.cpp展开。)