最近工作需要,想在qt下画OpenGL,时间紧迫没时间研究QOpenGLWidget,完成了自定义的opengl类,依赖的是GLEW库。这里跟大家分享一下心得,文采有限,多多包涵。
1、下载GLEW库,添加到工程中,下载源码即可,然后C++预定义设置GLEW_STATIC,如下图
2、windows下建立GL上下文环境的类,这个不必多言。
3、(重点)创建自己的opengl类,继承自QWidget,这里我自己建立的为bergGLwidget
bergGLwidget.h
#pragma once
#include "GLContext.h"
#include <QWidget>
#include <QTimer>
class bergGLWidget : public QWidget
{
Q_OBJECT
public slots:
void _renderWin();
public:
bergGLWidget(QWidget *parent);
virtual ~bergGLWidget();
void setup();
virtual void initGL();
virtual void renderGL();
int _width;
int _height;
private:
GLContext _context;
void swapBuffer();
void initializeGL();
};
bergGLwidget.cpp
#include "bergGLWidget.h"
#include <windows.h>
bergGLWidget::bergGLWidget(QWidget *parent)
: QWidget(parent)
{
}
bergGLWidget::~bergGLWidget()
{
_context.shutdown();
}
void bergGLWidget::initGL()
{
}
void bergGLWidget::renderGL()
{
}
void bergGLWidget::setup()
{
HWND winid = (HWND)winId();
_context.setup(winid, GetDC(winid));
initializeGL();
}
void bergGLWidget::initializeGL()
{
glewInit();
initGL();
QTimer *ti = new QTimer(this);
connect(ti, SIGNAL(timeout()), this, SLOT(_renderWin()));
ti->start(20);
}
void bergGLWidget::swapBuffer()
{
_context.swapBuffer();
}
void bergGLWidget::_renderWin()
{
_width = this->width();
_height = this->height();
glClearColor(0.0, 0.0, 0.0, 1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glViewport(0, 0, _width, _height);
renderGL();
swapBuffer();
}
建立完成。
疑问1:
自定义类中构造函数并未设置hdc句柄,在建立窗口并不能像qt自带的opengl类一样继承就能用,这里需要在调用函数处setup,
原因:防止布局器id与widget id不同:
具体用法为:
这里在主窗口中嵌入opengl窗口,glwidget继承自bergGLWidget,。
如上图设置之后,无论布局器及分裂器如何分配窗口,都不会出现问题。
另:shader的初始化工作可以在函数initGL()中。
原创声明,转载请注明出处。
有疑问或者有指教请下方留言。