Пользовательские QOpenGLWidget и GLEW включают

Извините, если это очень простой вопрос, но я запутался:
Я использую Visual Studio и создаю собственный класс QOpenGLWidget (путем наследования от базового класса), и моя проблема заключается в следующем:

  • Если я добавлю #include <QOpenGLWidget> в свой собственный класс, а также добавлю #include для glew.h, я смогу получить доступ к вещам, определенным в glew.h
  • Но если я добавлю #include <QtWidgets> в свой пользовательский класс (который, хотя я бы покрыл и QOpenGLWidget), то я не могу получить доступ к тому, что определено в glew.h, и я вижу ошибки «идентификатор не определен» (например, для glGenVertexArrays)

Может кто-нибудь, пожалуйста, скажите мне, что мне здесь не хватает? Я предполагаю, что включение того, что мне нужно (#include <QOpenGLWidget>), лучше, чем много вещей в <QtWidgets>, но почему это должно мешать мне получить доступ к тому, что определено в glew.h?

Любая помощь приветствуется


person Farzad    schedule 29.02.2016    source источник
comment
Обратите внимание, что #include <QtWidgets> подразумевает #include <QtGui>, что, в свою очередь, делает #include <qopengl.h>, которое, в свою очередь, включает некоторые заголовки OpenGL. Возможно, у glew.h есть какая-то #ifndef защита, которая срабатывает при этом.   -  person peppe    schedule 29.02.2016
comment
Кстати, вы уверены, что вам нужен GLEW?   -  person peppe    schedule 29.02.2016
comment
@peppe Я думаю, мне нужен GLEW, потому что я вызываю прямые функции API OpenGL и не использую оболочки в Qt. Я что-то упускаю?   -  person Farzad    schedule 29.02.2016
comment
Просто вы можете использовать прямые оболочки в Qt :-)   -  person peppe    schedule 29.02.2016
comment
@peppe: За исключением того, что он не может, так как они не все упаковывают. Они предоставляют общий интерфейс OpenGL ES 2, а не полный настольный GL.   -  person Nicol Bolas    schedule 29.02.2016
comment
? Они делают предоставляют полную настольную GL. У вас есть преобразователи для каждой версии (например, это для ядра 3.3) и для каждого расширения (см. QOpenGLExtensions).   -  person peppe    schedule 29.02.2016


Ответы (1)


Вы не можете одновременно включать оболочки Qt OpenGL и большинство заголовков библиотеки загрузки OpenGL. Разные файлы .cpp могут включать разные заголовки, но один и тот же .cpp не может. Итак, вам придется выбрать, что вы хотите использовать: GLEW или оболочку Qt OpenGL.

Причина, по которой это не работает, заключается в том, что загрузчики обычно используют защиту включения, которая предотвращает случайное включение <GL/gl.h> или подобных заголовков. Загрузка библиотек, как правило, является эксклюзивной, поскольку они часто определяют те же символы, что и другие заголовки OpenGL. И если бы они не удерживали вас от этого, вы могли бы получить ошибки множественных определенных символов, если попытаетесь включить оба.

Оболочка Qt OpenGL сама по себе является загрузочной библиотекой. Таким образом, он выполняет тот же трюк с исключением, определяя защиту включения, которую будет использовать GLEW и другие загрузчики. Таким образом, вы не можете использовать оба в одном и том же файле .cpp.

person Nicol Bolas    schedule 29.02.2016