LearnOpenGL-QT 1). 环境配置及窗口绘制

5 篇文章 0 订阅
5 篇文章 0 订阅

背景

因为Qt已经封装了openGL,所以结合Qt进行openGL学习将会比较便捷。

配置

为了在Qt(6.3.1) & Qt Creator(8.0.1) 中使用openGL,需要在CmakesList.txt中配置:

find_package(Qt6 REQUIRED COMPONENTS Core Gui OpenGL OpenGLWidgets Widgets)

target_link_libraries(MyQtApp PRIVATE Qt${QT_VERSION_MAJOR}::Widgets
    Qt::Core
    Qt::Gui
    Qt::OpenGL
    Qt::OpenGLWidgets
    Qt::Widgets)

窗口绘制

QOpenGLWidget

Qt5.4之前,Qt可以通过一个QGLWidget类来创建opengl窗口,但由于opengl的发展,在5.4版本的时候,Qt提供了一个QGLWidget的现代替代品——QOpenGLWidget。因此,这个教程使用的是QOpenGLWidget来创建和管理窗口。

创建opengl窗口只需新建类继承于QOpenGLWidegt,再实现QOpenGL提供的三个虚函数,就可以完成opengl窗口的创建。

  • initializeGL() — 建立OpenGL的资源和状态。在第一次调用resizeGL()或paintGL()之前调用一次
  • resizeGL() — 设置OpenGL视口,投影等。每当调整Widget的大小时(第一次显示窗口Widget时会调用它,因为所有新创建Widget都会自动获得调整大小的事件)。
  • paintGL() — 渲染OpenGL场景,需要更新Widget时就会调用。
QOpenGLExtraFunctions

QOpenGLExtraFunctions类继承于QOpenGLFunctions,相较于QOpenGLFunctions,额外提供了对OpenGL ES 3.0、3.1和3.2 API的跨平台访问,如果我们需要在类中使用opengl函数,只需要使类继承于QOpenGLExtraFunctions。

创建工程

创建 Qt Widgets Application,新建widget.cpp / widget.h, 并在widget.h中包含头文件 、 修改Widget公有继承自这两个类
重写 initializeGL()、resizeGL(int w,int h)、paintGL(),一般使用protected修饰
完成后你的Widget.h应该是如下的样子:

#ifndef WIDGET_H
#define WIDGET_H
 
#include <QOpenGLWidget>
#include <QOpenGLExtraFunctions>
class Widget : public QOpenGLWidget,public QOpenGLExtraFunctions
{
    Q_OBJECT
 
public:
    Widget(QWidget *parent = 0);
    ~Widget();
protected:
    virtual void initializeGL() override;
    virtual void resizeGL(int w,int h) override;
    virtual void paintGL() override; 
};
 
#endif // WIDGET_H

再对函数进行实现,你的Widget.cpp应该是如下的样子:

#include "widget.h"
 
Widget::Widget(QWidget *parent)
    : QOpenGLWidget(parent)
{}
 
Widget::~Widget()
{}
 
void Widget::initializeGL()
{
    this->initializeOpenGLFunctions();        //初始化opengl函数
}
 
void Widget::resizeGL(int w, int h)
{
    this->glViewport(0,0,w,h);                //定义视口区域
}
 
void Widget::paintGL()
{
    this->glClearColor(0.1f,0.5f,0.7f,1.0f);  //设置清屏颜色
    this->glClear(GL_COLOR_BUFFER_BIT);       //清除颜色缓存
}

然后在main函数入口中调用:

#include "widget.h"
#include <QApplication>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

即可以看到运行程序:
Screen Shot 2022-10-06 at 10.54.04.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值