在Qt中为QOpenGLWidget设置OpenGL

时间:2015-06-01 00:36:32

标签: c++ qt opengl qt5

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

到目前为止,我在Qt中所拥有的是默认主窗口和Visualizer类,它继承自QOpenGLWidgetQOpenGLFunctions。通过将MainWindow设置为Visualizer的父级,我可以将小部件显示为黑框。

为了编译使用glGenVertexArrays();等函数的旧OpenGL代码,我使这些类继承自QOpenGLFunctions_3_3_Core。我还会在必要时拨打initializeOpenGLFunctions(),例如initializeGL()类的Visualizer内部以及MeshShaderTexture的构造函数。

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

我猜是某种内存违规。我是否必须在Qt中为QOpenGLWidget

手动设置OpenGL上下文

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

1 个答案:

答案 0 :(得分:0)

我提出了一个有趣的解决方案。也许这很明显,但我一开始并没有看到它。我基本上在一个虚拟类QOpenGLFunctions_3_3_Core中创建了一个类型为GL的静态变量,并在需要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);