【问题标题】:Custom QOpenGLWidget and GLEW include自定义 QOpenGLWidget 和 GLEW 包括
【发布时间】:2016-02-29 15:55:41
【问题描述】:

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

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

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

感谢任何帮助

【问题讨论】:

  • 请注意,#include <QtWidgets> 意味着 #include <QtGui>,而 #include <qopengl.h> 又包含一些 OpenGL 标头。也许glew.h 有一些#ifndef 保护会被触发。
  • 顺便说一句,你确定你需要 GLEW 吗?
  • @peppe 我认为我需要 GLEW,因为我正在调用直接的 OpenGL API 函数,并且我没有使用 Qt 中的包装器。我错过了什么吗?
  • 只是你可以在 Qt 中使用直接包装器 :-)
  • @peppe:除了他不能,因为他们不会把所有东西都包起来。它们提供通用的 OpenGL ES 2 接口,而不是完整的桌面 GL。

标签: c++ qt opengl qtwidgets


【解决方案1】:

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

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

Qt 的 OpenGL 包装器本身就是一个加载库。所以它使用相同的排除技巧,定义 GLEW 和其他加载器将使用的包含防护。因此,您不能在同一个 .cpp 文件中同时使用两者。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 2011-04-11
    • 1970-01-01
    相关资源
    最近更新 更多