1. 说明:
在 Qt 中使用 OpenGL,实际上时严格遵循一种代码开发框架的,在 QtWidget 中,需要使用 openGlWidget 控件,并自定义类,类中还需继承 QOpenGLWidget,QOpenGLFunctions_3_3_Core 两个类,并将 openGlWidget 控件提升为我们自定义的类,才能正常显示图形,本文将介绍最基本的框架搭建,后续即可在这个框架中不断添加代码进行 OpenGL 的深入学习。
2. 步骤一:
首先创建一个 Qt Widget Application 工程,继承自 QMainWindow,工程名称命名为 LearnOpenGL,之后在设计师页面中,添加一个 OpenGlWidget 小控件,如下图所示:
并将主窗口的样式设置一下,以便进行区分(可不设置),如下图所示:
对应 styleSheet 的代码如下:
QWidget{
background-color:rgb(121,121,121);
color:rgb(255,255,255);
font:10pt "幼圆";
}
QMenuBar{
background-color:rgb(200,200,200);
color:rgb(60,60,60);
}
3. 步骤二:
之后,需要自定义一个类,此后所有与 OpenGL 相关的代码都会在这个类中进行实现,本文命名为 MyOpenGlWidget,此类需要同时继承 QOpenGLWidget,QOpenGLFunctions_3_3_Core,并重写 QOpenGLWidget 类中的三个虚函数,virtual void initializeGL(); virtual void resizeGL(int w, int h); virtual void paintGL(); 对应代码如下:
MyOpenGlWidget.h:
#ifndef MYOPENGLWIDGET_H
#define MYOPENGLWIDGET_H
#include <QObject>
#include <QWidget>
#include <QOpenGLWidget>
#include <QOpenGLFunctions_3_3_Core>
class MyOpenGLWidget : public QOpenGLWidget,QOpenGLFunctions_3_3_Core
{
Q_OBJECT
public:
explicit MyOpenGLWidget(QWidget *parent = nullptr);
protected:
virtual void initializeGL() override;
virtual void resizeGL(int w, int h) override;
virtual void paintGL() override;
signals:
};
#endif // MYOPENGLWIDGET_H
MyOpenGlWidget.cpp:
#include "myopenglwidget.h"
MyOpenGLWidget::MyOpenGLWidget(QWidget *parent) : QOpenGLWidget(parent)
{
}
void MyOpenGLWidget::initializeGL()
{
//必须在 initializeGL() 函数中加入下面一行代码,否则无法显示图形
initializeOpenGLFunctions();
}
void MyOpenGLWidget::resizeGL(int w, int h)
{
}
void MyOpenGLWidget::paintGL()
{
/* 后面所有与绘图相关的代码都会写在 paintGL() 函数中 */
//使用某种颜色填充窗口
glClearColor(0.5f,0.9f,0.4f,1.0f);
glClear(GL_COLOR_BUFFER_BIT);
}
4. 步骤三:
将上面在设计师窗口中添加的 openGLWidget 控件提升为自定义的类 MyOpenGLWidget,如下图所示:(在①处写入自定义类的名称,点击②的Add,确保③处打上√)
4. 步骤四:
运行程序,如果页面呈现草绿色,说明加载成功,如下图所示:里面没有任何图形,因为还没有在 paintGL()函数中添加代码,目前只是更改了背景颜色,后续的代码会在此框架上逐渐添加。