如何将QGLWidget子类化以使用glew



我正在努力编译一个使用glew的QGLWidget子类。我在Windows7上运行Qt 5.0.1+MinGW 4.7。Glew 1.7.0已与上述MinGW一起编译。

我已经用UGGLWidget对QGLWidget进行了子类化,并在QGLWidgetinclude之前包含了"GL/glew.h"。编译时我得到200个错误关于:

  • 'function'重新声明为不同类型的符号
  • 冲突声明"typedef"

所以我的问题是:如何获得QGLWidget的一个子类,该子类使用在Qt5下编译的glew


编辑:我在另一个设置中尝试了同样的方法(Qt4.7+MinGW4.4)。它编译和运行都很好。我还尝试过使用更新版本的glew(Qt5.0.1+MinGW4.7+glew1.9.0),它也不编译,并且会出现相同的编译错误。


以下是编译器输出的一个混乱片段:

> In file included from
> ............QtQt5.0.15.0.1mingw47_32include/QtGui/qopengl.h:55:0,
>                  from ............QtQt5.0.15.0.1mingw47_32includeQtOpenGL/qgl.h:47,
>                  from ............QtQt5.0.15.0.1mingw47_32includeQtOpenGL/QGLWidget:1,
>                  from srcUGGLWidget.h:4,
>                  from srcUGGLWidget.cpp:2: ............QtQt5.0.15.0.1mingw47_32include/GLES2/gl2.h:614:153:
> error: 'void __glewVertexAttribPointer(GLuint, GLint, GLenum,
> GLboolean, GLsizei, const GLvoid*)' redeclared as different kind of
> symbol In file included from srcUGGLWidget.cpp:1:0:
> ..3rdPartyLibsglewinclude/GL/glew.h:13609:46: error: previous
> declaration of 'void (__attribute__((__stdcall__)) *
> __glewVertexAttribPointer)(GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid*)'

最后但并非最不重要的是子类的头文件和源文件。它现在真的只是空的。

来源:

//UGGLWidget.cpp
#include "GL/glew.h"
#include "UGGLWidget.h"
UGGLWidget::UGGLWidget(QWidget *parent) : QGLWidget(parent) { ... }

标题:

//UGGLWidget.h
#ifndef UGGLWIDGET_H
#define UGGLWIDGET_H
#include <QGLWidget>
class UGGLWidget : public QGLWidget
{
    Q_OBJECT
public:
    explicit UGGLWidget(QWidget *parent = 0);
};
#endif // UGGLWIDGET_H

哦,也许还有来自.pro文件的相关部分

QT       += core gui opengl
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
LIBS += -L$$quote(../3rdPartyLibs/glew/lib/) -lglew32
LIBS += -lopengl32 -lglu32
INCLUDEPATH += $$quote(../3rdPartyLibs/glew/include)

下面修复了我的问题,这个问题无处不在,我在其中包括glew:

#include "GL/glew.h"
#define QT_NO_OPENGL_ES_2

另一个选项:在配置步骤中使用-opengl desktop从源代码构建Qt5.0.1。


出于某种原因,QT_OPENGL_ES_2是在我的Qt5.0.1安装中定义的。通过查看QGLWidget.h的插件,我在QtCore/qconfig.h中发现了以下内容

#if defined(QT_OPENGL_ES_2) && defined(QT_NO_OPENGL_ES_2)
# undef QT_OPENGL_ES_2
#elif !defined(QT_OPENGL_ES_2)
# define QT_OPENGL_ES_2
#endif

这导致包含了GLES2/gl2.h,这与glew不兼容。知道这个问题与GLES2有关,我看到了一份错误报告和一篇QtProject帖子。如果我理解正确,那么为Qt5.0.1提供的QtSDK安装程序已经构建好,从而启用了GLES。

祝你今天过得愉快,
~莫里茨

请注意,QT 4.8RC发布说明中写道:包括QtOpenGL将不能与GLEW结合使用,因为QGLFunction将取消定义GLEW的定义。

相关内容

  • 没有找到相关文章

最新更新