Introduction
挣扎于各大博客教程皆不完全对的情况,浪费了很多时间。经过stackoverflow上一个兄dei的指点,才成功。
效果
实现
在UI编辑中拖出OpengGLWidget放置于任何一个想嵌入的窗体中。回到代码编辑中,新建一个c++ header,如"glTriangle.h"
#ifndef GLTRIANGLE_H
#define GLTRIANGLE_H!
#include <QWidget>
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <gl/GLU.h>
#include <gl/GL.h>
class GLTriangle : public QOpenGLWidget, protected QOpenGLFunctions
{
Q_OBJECT
public:
GLTriangle(QWidget *parent = nullptr);
~GLTriangle();
protected:
void initializeGL() override;
void paintGL() override;
void resizeGL(int width, int height) override;
private:
};
#endif // GLTRIANGLE_H
第二步,新建该类的实现。“glTriangle.cpp”
#include "gltriangle.h"
GLTriangle::GLTriangle(QWidget *parent) : QOpenGLWidget(parent)
{
}
GLTriangle::~GLTriangle()
{
}
void GLTriangle::initializeGL()
{
initializeOpenGLFunctions();
glClearColor(0.1,0.1,0.1,1);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
glEnable(GL_COLOR_MATERIAL);
}
void GLTriangle::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(-0.5, -0.5, 0);
glColor3f(0.0, 1.0, 0.0);
glVertex3f( 0.5, -0.5, 0);
glColor3f(0.0, 0.0, 1.0);
glVertex3f( 0.0, 0.5, 0);
glEnd();
}
void GLTriangle::resizeGL(int width, int height)
{
glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
}
第三步,回到UI编辑。右击刚拖出来的OpenGLWidget块体,选择“提升为promoted as”,提升的类名称输入刚才定义的类名,确认headfile是刚才定义的头文件,然后点击添加。关闭对话框后,右击“提升为”,选择刚才创建的类名。
第四步,如果编译链接报错,说找不到对应的库,需要打开工程项目文件xxx.pro,加入一行把openg给link进来。
LIBS += -lopengl32
技术回顾
Qt5.x (x>4) 版本提供了QOpenGLWidget类,只要继承该类,并实现对应的三个虚函数就能显示。
void initializeGL() override;
void paintGL() override;
void resizeGL(int width, int height) override;
函数原型如下