首先打开Qt Creator,然后点击菜单 ,文件->新建文件和项目,如图所示:
左边选择Application,右边选择Qt Widgets Application,点击Choose...,
项目名称为myOpenGLShow,接着下一步,一直默认,到Details,如下:
点击取消选中创建界面(G)。
然后下一步,知道完成,程序显示的为mainwindow.cpp文件:
接着是利用QOpenGLWidget类,为了显示自定义的opengl绘制函数,我们新建一个继承QOpenGLWidget类的自定义类。
选中项目文件,右键->添加新文件,如图所示:
选择C++类,choose...,如图所示:
类的名称为myopenGL,同时继承Qwidget(组件)类。点击下一步直到完成,此时工程目录下添加了myopenGL.cpp,myopenGL.h文件。
接着在myopengl.h中进行操作,首先添加四个头文件:
#include <GL/gl.h>
#include <GL/glu.h>
#include<QOpenGLWidget>
#include"QOpenGLFunctions"
然后将myopenGl的继承类改为public QOpenGlWidget,protected QOpenGLFuctions(在.h和.cpp文件中都需要修改)同时重载QopenGLWidget类中的
initializeGL(),resizeGL(),paintGL()三个函数。如图所示:
然后是在myopengl.cpp中进行操作,首先写重载的三个函数:
void myopenGL::initializeGL()
{
initializeOpenGLFunctions();
glClearColor(0,0,0,1);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);
// cout<<glGetString(GL_VERSION)<<endl;
}
void myopenGL::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(-5, -5, 0);
glColor3f(0.0, 1.0, 0.0);
glVertex3f( 5, -5, 0);
glColor3f(0.0, 0.0, 1.0);
glVertex3f( 0.0, 5, 0);
glEnd();
}
void myopenGL::resizeGL(int width, int height)
{
glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-width/2,width/2,-height/2,height/2,-1,1);
glMatrixMode(GL_MODELVIEW);
}
所要绘制的东西在paintGL函数中,使用glBegin()和glEnd()固定模式,代码的具体含义读者可以查找网络上其他的资源,此处重点是讲解如何写自己的openGL类来实现目标的绘制。
接着是在mainwindow.h文件中进行操作,添加头文件:
#include"myopengl.h"
同时添加一个myopenGl成员对象,如下所示:
然后是在mainwindow.cpp文件中进行操作,在其构造函数中添加如下代码:
代码含义,如注释所示。
运行:
则可以看到paintGL中绘制的对象显示出来,此处我们定义了一个新类myopenGL,这个类就是我们自己的资源了,在其他工程中我们,只需要添加myopenGL.h,myopenGL到工程中,就可以用自定义的openGL类进行绘图了。
下面介绍常见的错误:
解决办法:在工程pro中添加:
QT +=core gui opengl
LIBS+=-lopengl32 -lglu32
申明程序调用openGL以及对应的库。
错误二:如果程序运行的结果为白框,不为黑框。
解决办法:可在main.cpp中,main函数第一行添加如下代码:
QCoreApplication::setAttribute(Qt::AA_UseDesktopOpenGL);
设置调用的OpenGL的版本。
到这里相信读者已经掌握了如何用自定义的openGL类来绘图了,如果有任何疑问可以下载源码仔细研究。