qt不使用自带的opengl及扩展库,使用opengl上下文在windows下建立窗口

最近工作需要,想在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()中。

 

原创声明,转载请注明出处。

有疑问或者有指教请下方留言。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值