主要是利用Qt中的定时器实现了二维图形的旋转功能:
#ifndef QGLTEST_H#define QGLTEST_H#include#include #include #include #include #include class QGLTest : public QGLWidget{ Q_OBJECTpublic: QGLTest(QWidget* parent = 0, const char* name = 0, bool fs = false); ~QGLTest();protected: //初始化窗口组件 void initializeGL(); //绘制OpenGL窗口(只要有更新就会被调用) void paintGL(); //处理窗口变化的事件 void resizeGL(int width, int height); //按键按下的触发事件 void keyPressEvent(QKeyEvent *e); //定时器的使用(函数的重写, 先继承, 后重写) void timerEvent(QTimerEvent *event);protected: bool fullscreen; //是否全屏 GLfloat rTri; //三角形的旋转 GLfloat rQuad; //矩形的旋转};#endif // QGLTEST_H
#include "qgltest.h"//构造函数(对QGLTest下面的有参构造函数进行初始化操作, 而QGLTest这个类本身是继承自QGLWidget)QGLTest::QGLTest(QWidget* parent, const char* name, bool fs) : QGLWidget(parent){ //设置窗口全屏 fullscreen = fs; //初始化参数 rTri = 0.0; rQuad = 0.0; //设置窗口的位置(左上0,0; 640*480) setGeometry(0, 0, 640, 480); //设置窗口的标题 setWindowTitle("Nehe's OpenGL framwork Testing…………"); if (fullscreen) { showFullScreen(); } //这也是成员函数 startTimer(50);}//析构函数QGLTest::~QGLTest(){}//OpenGL窗口创建之后会调用该函数void QGLTest::initializeGL(){ setGeometry(300, 150, 640, 480); //启动阴影平滑(阴影平滑通过多边形精细的混合色彩,并对外部光进行平滑) glShadeModel(GL_SMOOTH); //设置清除屏幕的时候使用的颜色(RGBA) glClearColor(0.0, 0.0, 0.0, 0.5); //设置深度缓存(深度缓存不断的对物体进入屏幕内部有多深进行跟踪,它的排序决定那个物体先画) glClearDepth(1.0); //开启深度测试 glEnable(GL_DEPTH_TEST); //开启深度测试的类型 glDepthFunc(GL_LEQUAL); //启用真正精细的透视修正 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);}//重置当前的窗口void QGLTest::resizeGL(int width, int height){ if (0 == height) { height = 1; } //重置当前的视口 glViewport(0, 0, (GLint)width, (GLint)height); //选择投影矩阵(透视效果) glMatrixMode(GL_PROJECTION); //重置投影矩阵 glLoadIdentity(); //建立透视投影矩阵(视角, 实际窗口纵横比, 相机能看见的最近距离和最远距离) gluPerspective(45.0, (GLfloat)width / (GLfloat)height, 0.1, 100.0); //选择模型观察矩阵(模型观察矩阵中存放了我们的物体讯息) glMatrixMode(GL_MODELVIEW); //重置模型观察矩阵 glLoadIdentity();}//实现我的绘图函数void QGLTest::paintGL(){ //清除屏幕和深度缓存 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //重置当前的模型观察矩阵 glLoadIdentity(); //绘制一个矩形和一个三角形 glTranslatef(-1.5, 0.0, -6.0); //开始旋转 glRotatef(rTri, 0.0, 1.0, 0.0); glBegin(GL_TRIANGLES); glColor3f(1.0, 0.0, 0.0); glVertex3f( 0.0, 1.0, 0.0); //上顶点 glColor3f(0.0, 1.0, 0.0); glVertex3f(-1.0, -1.0, 0.0 ); //左下 glColor3f(0.0, 0.0, 1.0); glVertex3f( 1.0, -1.0, 0.0 ); //右下 glEnd(); //矩形绕着x轴旋转 glLoadIdentity(); glTranslatef(1.5, 0.0, -6.0); glRotatef(rQuad, 1.0, 0.0, 0.0); glColor3f(0.5, 0.5, 1.0); glBegin(GL_QUADS); glVertex3f(-1.0, 1.0, 0.0); glVertex3f( 1.0, 1.0, 0.0); glVertex3f( 1.0, -1.0, 0.0); glVertex3f(-1.0, -1.0, 0.0); glEnd();}//对按键的处理void QGLTest::keyPressEvent(QKeyEvent *e){ switch (e->key()) { //按下F2按键全屏 case Qt::Key_F2: fullscreen = !fullscreen; if (fullscreen) { //开始全屏(只对顶级窗口有效) showFullScreen(); } else { //设置为顶级窗口模式 showNormal(); //重置窗口(恢复原始窗口) setGeometry(0, 0, 640, 480); } //updateGL()会调用paintGL()实现更新 updateGL(); break; //按下ESC会退出 case Qt::Key_Escape: close(); }}
此时如果直接运行, 效果如下:
发现并没有旋转,几经周折后,添加一个定时器, 即可实现旋转:
//定时器的使用(::表示对一个类的成员函数进行实现)void QGLTest::timerEvent(QTimerEvent *event){ //改变旋转的角度 rTri += 2; rQuad -= 15; updateGL(); //开始递归调用 //QGLWidget::timeEvent(event); //error: “timeEvent”: 不是“QGLWidget”的成员 QGLWidget::timerEvent(event);}