QOpenGLWidget
依旧从最简单的建立窗口开始。从Qt5.4开始,Qt推荐使用QOpenGLWidget,它将替代我们之前使用的QGLWidget。和QGLWidget一样,QOpenGLWidget提供了三个方便的虚函数,我们可以在子类中实现它们。
- paintGL() - 渲染OpenGL场景。每次窗口部件更新时调用。
- resizeGL() - 设置OpenGL视口、投影等。每次窗口部件尺寸发生变化时(和第一次显示时因为所有新建的窗口部件都会自动地得到resize event)调用。
- initializeGL() - 设置OpenGL资源 和状态。只调用一次,在第一次调用 resizeGL() 或paintGL()之前。
QOpenGLFunctions
QOpenGLFunctions类提供了访问OpenGL ES 2.0的跨平台API。OpenGL 2.0 提供了OpenGL中的子类集合,可以提供跨多个平台的桌面系统以及嵌入式OpenGL的实现。然而,却很难使用子类因为子类需要解决许多平台系统的操作问题。因此 QOpenGLFunctions提供了这样的API,可以保证在所有的OpenGL系统中使用,并且也关注不同系统中的OpenGL的版本API的使用。Qt推荐直接继承的方式来使用 QOpenGLFunctions类。
示例演示
新建MyQLWidget类,继承自QOpenGLWidget和QOpenGLFunctions。
头文件myQGLWidget.h
#ifndef MY_QGLWIDGET_H
#define MY_QGLWIDGET_H
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
class MyQGLWidget : public QOpenGLWidget , protected QOpenGLFunctions
{
Q_OBJECT
public:
MyQGLWidget(QWidget *parent = 0);
protected:
void initializeGL();
void resizeGL(int width, int height);
void paintGL();
};
#endif
源文件myQGLWidget.cpp
#include <QtGui>
#include <QtOpenGL>
#include "myQGLWidget.h"
MyQGLWidget::MyQGLWidget(QWidget *parent)
: QOpenGLWidget(parent)
{
}
void MyQGLWidget::initializeGL()
{
initializeOpenGLFunctions();
glClearColor(0.0f, 0.0f, 1.0f, 0.0f);
glEnable(GL_DEPTH_TEST);
}
void MyQGLWidget::resizeGL(int width, int height)
{
glViewport(0, 0, width, height);
}
void MyQGLWidget::paintGL()
{
glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT);
glClearColor(0.0f, 0.0f, 1.0f, 0.0f);
}