Qt5.9.4中利用QOpenGLWidget类进行opengl绘图

时间:2022-09-18 23:13:18

首先打开Qt Creator,然后点击菜单 ,文件->新建文件和项目,如图所示:

Qt5.9.4中利用QOpenGLWidget类进行opengl绘图

左边选择Application,右边选择Qt Widgets Application,点击Choose...,

Qt5.9.4中利用QOpenGLWidget类进行opengl绘图

项目名称为myOpenGLShow,接着下一步,一直默认,到Details,如下:

Qt5.9.4中利用QOpenGLWidget类进行opengl绘图

点击取消选中创建界面(G)。

然后下一步,知道完成,程序显示的为mainwindow.cpp文件:

Qt5.9.4中利用QOpenGLWidget类进行opengl绘图

接着是利用QOpenGLWidget类,为了显示自定义的opengl绘制函数,我们新建一个继承QOpenGLWidget类的自定义类。

选中项目文件,右键->添加新文件,如图所示:

Qt5.9.4中利用QOpenGLWidget类进行opengl绘图

选择C++类,choose...,如图所示:

Qt5.9.4中利用QOpenGLWidget类进行opengl绘图

类的名称为myopenGL,同时继承Qwidget(组件)类。点击下一步直到完成,此时工程目录下添加了myopenGL.cpp,myopenGL.h文件。

Qt5.9.4中利用QOpenGLWidget类进行opengl绘图

接着在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()三个函数。如图所示:

Qt5.9.4中利用QOpenGLWidget类进行opengl绘图

然后是在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成员对象,如下所示:

Qt5.9.4中利用QOpenGLWidget类进行opengl绘图

然后是在mainwindow.cpp文件中进行操作,在其构造函数中添加如下代码:

Qt5.9.4中利用QOpenGLWidget类进行opengl绘图

代码含义,如注释所示。

运行:

Qt5.9.4中利用QOpenGLWidget类进行opengl绘图

则可以看到paintGL中绘制的对象显示出来,此处我们定义了一个新类myopenGL,这个类就是我们自己的资源了,在其他工程中我们,只需要添加myopenGL.h,myopenGL到工程中,就可以用自定义的openGL类进行绘图了。

下面介绍常见的错误:

Qt5.9.4中利用QOpenGLWidget类进行opengl绘图

解决办法:在工程pro中添加:

QT +=core gui opengl
LIBS+=-lopengl32 -lglu32

申明程序调用openGL以及对应的库。

错误二:如果程序运行的结果为白框,不为黑框。

解决办法:可在main.cpp中,main函数第一行添加如下代码:

 QCoreApplication::setAttribute(Qt::AA_UseDesktopOpenGL);

设置调用的OpenGL的版本。

到这里相信读者已经掌握了如何用自定义的openGL类来绘图了,如果有任何疑问可以下载源码仔细研究。