在 Qt 中为 QOpenGLWidget 设置 OpenGL

Setting Up OpenGL in Qt for QOpenGLWidget

我有一些用 GLEW 创建的旧 OpenGL 代码。我正在尝试将此代码移植到 Qt 5.4 中,旧代码包含 MeshShaderTexture classes.

到目前为止,我在 Qt 中拥有的是默认的 main window 和继承自 QOpenGLWidgetQOpenGLFunctionsVisualizer class。通过将 MainWindow 设置为 Visualizer.

的父级,我可以将小部件显示为黑框

为了编译使用 glGenVertexArrays(); 等函数的旧 OpenGL 代码,我使 classes 继承自 QOpenGLFunctions_3_3_Core。我还在必要时调用 initializeOpenGLFunctions(),例如 Visualizer class 的 initializeGL() 内部以及 MeshShader 和 [= 的构造函数中12=].

编译都很好。但是,当我 运行 程序在尝试创建 Mesh 对象时调用函数 glGenVertexArrays(); 时它崩溃了。

我猜测存在某种内存冲突。我是否必须在 Qt 中为 QOpenGLWidget 手动设置 OpenGL 上下文?

如何使用 Qt 正确设置 OpenGL 3.3,以便我可以使用 QOpenGLWidget 渲染 OpenGL 内容并使用所有这些 OpenGL 函数,例如 glGenVertexArrays()

我想到了一个有趣的解决方案。也许这很明显,但我一开始没有看到。我基本上在虚拟 class、GL 中创建了一个 QOpenGLFunctions_3_3_Core 类型的静态变量,并在需要 OpenGL 函数时在整个代码中使用它。

例如

class GL{
  public:
    static QOpenGLFunctions_3_3_Core funcs;
}

...

class Visualizer : public QOpenGLWidget{

   ...

   void initializeGL(){
      GL::funcs.initializeOpenGLFunctions();
   }
   ...
}

...

// Example usage
GL::funcs.glGenVertexArrays(1, &id);
GL::funcs.glClearColor(1.f, 1.f, 1.f, 1.f);