自定义QOpenGLWidget和GLEW包括

时间:2016-02-29 15:55:42

标签: c++ qt opengl qtwidgets

对不起,如果这是一个非常基本的问题,但我很困惑:
我正在使用Visual Studio,我正在创建一个自定义QOpenGLWidget类(通过从基类继承),我的问题如下:

  • 如果我在自定义类中添加#include <QOpenGLWidget>,并为#include添加glew.h,我可以访问glew.h
  • 中定义的内容
  • 但是如果我在我的自定义类中添加#include <QtWidgets>(我也会覆盖QOpenGLWidget),那么我无法访问glew.h中定义的内容并且我看到“标识符未定义“错误(例如,glGenVertexArrays

有人可以告诉我,我在这里缺少什么吗?我猜测包含我只需要的内容(#include <QOpenGLWidget>)比<QtWidgets>中的大量内容要好,但为什么它会阻止我访问glew.h中定义的内容?

感谢任何帮助

1 个答案:

答案 0 :(得分:1)

您无法同时包含Qt的OpenGL包装大多数OpenGL loading library标头。不同的.cpp文件可以包含不同的标头,但相同的.cpp不能。所以你必须选择你想要使用的东西:GLEW或Qt的OpenGL包装器。

这不起作用的原因是因为加载程序通常使用包含防护措施来防止您意外包含<GL/gl.h>或类似标题。加载库往往是独占的,因为它们通常定义与其他OpenGL标头相同的符号。如果他们没有阻止您这样做,那么如果您尝试包含两者,则可能会出现多重定义的符号错误。

Qt的OpenGL包装器本身就是一个加载库。所以它做了相同的排除技巧,定义了GLEW和其他加载器将使用的包含保护。因此,您无法在同一个.cpp文件中使用它们。