2013-02-10 70 views
2

我很努力地得到一個使用glew的QGLWidget編譯的子類。我在Windows 7上運行Qt 5.0.1 + MinGW 4.7。Glew 1.7.0已經與MinGW一起編譯。如何繼承QGLWidget以使用glew?

在QGLWidget包含之前,我已經用UGGLWidget子類化了QGLWidget,並且包含"GL/glew.h"。編譯時,我得到200個錯誤有關:

  • '功能' 重新聲明爲不同意義的符號
  • 衝突的聲明 '的typedef'

所以我的問題的: 我如何得到一個QGLWidget的子類,它使用在Qt5下編譯的glew?


編輯:我試着用另一設置(Qt4.7 + MinGW4.4)相同的方法。它編譯和運行得很好。我也嘗試過使用更新版本的glew(Qt5.0.1 + MinGW4.7 + glew1.9.0),它不能編譯,並給出相同的編譯錯誤。


以下是編譯器輸出的凌亂的片段:

> In file included from 
> ..\..\..\..\..\..\Qt\Qt5.0.1\5.0.1\mingw47_32\include/QtGui/qopengl.h:55:0, 
>     from ..\..\..\..\..\..\Qt\Qt5.0.1\5.0.1\mingw47_32\include\QtOpenGL/qgl.h:47, 
>     from ..\..\..\..\..\..\Qt\Qt5.0.1\5.0.1\mingw47_32\include\QtOpenGL/QGLWidget:1, 
>     from src\UGGLWidget.h:4, 
>     from src\UGGLWidget.cpp:2: ..\..\..\..\..\..\Qt\Qt5.0.1\5.0.1\mingw47_32\include/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 src\UGGLWidget.cpp:1:0: 
> ..\3rdPartyLibs\glew\include/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) 
+0

您是否初始化GLEW? http://glew.sourceforge.net/basic.html – cmannett85 2013-02-11 08:31:33

+0

@ cmannett85是的,我在初始化GL()。雖然我的問題已經在編譯子類。 glewInit()應該只在運行時才重要。我會在問題中澄清這一點,謝謝。 – 2013-02-11 09:46:59

+0

我試着將glew放到一起,把我的賭注放在提供我需要的所有功能的QGLWidget上,但是這也失敗了。 glPointSize,glDeleteVertexArrays和其他關於頂點數組的函數沒有在QGLWidget的範圍內聲明。 – 2013-02-12 01:47:15

回答

2

以下固定我的問題,這正好無處不在,在哪裏我包括glew:

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

另一種選擇:在配置步驟中從源碼構建Qt5.0.1,使用-opengl desktop


由於某種原因,QT_OPENGL_ES_2是在我的Qt5.0.1安裝中定義的。作者從QGLWidget.h的inlcudes我發現下面的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有關,我碰到了一個bug report和一個QtProject post。 如果我理解正確,那麼爲Qt5.0.1提供的QtSDK安裝程序已經構建,以便啓用GLES。

有一個好的一天,
〜莫里茨

2

注意QT 4.8RC發佈說明稱: 包括QtOpenGL不會與GLEW組合工作,因爲QGLFunctions將取消定義GLEW的定義。