Qt的源碼及預編譯安裝包在 Qt Archive下載,http://download.qt.io/archive/qt/, 目前最新的是Qt5,其中和Qt4不同的是,Qt5多了個QOpenGLWidget,而且自己包裝了一套OpenGL函數,有時候還是想用第三方而不是全部的Qt一籃子解決方案的。這里還是用Qt4.8.6的SDK,OpenGL使用glew這樣第三方圖形擴展庫,還能配置Qt+OSG,Qt+OGRE等很多C++庫。
Qt4.8.6 下載地址 http://download.qt.io/archive/qt/4.8/4.8.6/qt-opensource-windows-x86-vs2010-4.8.6.exe,可以看到200多M的SDK,相比現在Qt5的2~3G小很多了。
安裝在D:\Qt或者自己創建的目錄,建議目錄不要帶中文。安裝完成以后再安裝Qt VS Addin 1.1.11 http://download.qt.io/archive/vsaddin/1.1.11/qt-vs-addin-1.1.11-opensource.exe
安裝路徑都是缺省安裝,安裝完成以后打開VS2010,看到菜單
,說明安裝成功,這是一個方便在VC中用QT編寫C++程序的插件。
接着單擊Qt->Qt Options中單擊Add,設置QTDIR,名字取Qt4.8.6, 路徑填bin上一個路徑
填好以后設置Defalut Qt/Win version為Qt4.8.6

接下來創建一個Qt GUI Applicatioin,在 文件->新建->項目,可以看到已經有Qt4 projetcs模版了

選擇Qt Application后,天上qtglewtest0,下一步設置向導,在project setting那里記得OpenGL library
勾上

然后finish,這個時候,項目樹是

項目樹上在qtglewtest0.ui上右鍵,打開方式

選擇Qt Designer,然后確定

彈出了Qt Designer編輯qtglewtest0.ui, 可以手動編輯ui,具體要參考<<C++ GUI Qt 4編程>>

編譯一下工程,主菜單 生成->生存解決方案,按綠色的三角箭頭,運行的exe如下,一個主框架窗口,包含一個菜單,一個centerWidget,一個狀態條

下面來集成glew庫,opengl的API版本不斷在升級和增加,現在已經Opengl 4.5了,舊的顯卡驅動只能支持低版本的OpenGL,新的顯卡驅動能支持到OGL3,4及以上
怎么用新的OpenGL API,比如glDrawTransformFeedback是4.0以后才有的API,OpenGL有一個擴展機制,一個擴展是一個字符串,一種擴展表示有新特性的幾個API。我們使用的VS編譯器,windows已經提供了一個gl.h, 和opengl32.lib,glu32.lib, 還有opengl32.dll,這個在system32目錄中,還有一些wglXXX相關的API,在nehe的例子中,一般是win32 api直接寫的opengl程序,我們可以看到這些不是opengl的API屬於window專有的,用於創建管理OpenGL上下文的。gl.h中沒有的API通過查glGetString(GL_EXTENSIONS) 返回的字符串,然后通過wglGetProcAddress("glXXX")得到該glXXX的函數指針,具體有哪些擴展字符串,各個字符串屬於什么OpenGL版本,各個字符串對應的哪些新的gl函數,新特性的描述,這些都在opengl.org和khronos.org去查,一般在specifications文檔中詳細記錄。
總之很細節很麻煩了,所以有很多開源的opengl擴展庫,屏蔽了上面獲取擴展API的過程,glew就是一個普遍采用的OpenGL擴展庫,下面是步驟:
1.下載glew2.1.0 https://sourceforge.net/projects/glew/files/glew/2.1.0/glew-2.1.0-win32.zip/download
2.解壓放到d:\mclib\glew-2.1.0, 配置qtglewtest0工程屬性中的
include目錄 添加 D:\mclib\glew-2.1.0\include
鏈接/常規/附加庫目錄 添加 D:\mclib\glew-2.1.0\lib\Release\Win32
鏈接/輸入 添加
opengl32.lib
glu32.lib
glew32.lib
3. 下面是glwidget.h 和 glwidget.cpp 文件的源代碼
glwidget.h
#ifndef GLWIDGET_H #define GLWIDGET_H #include <QGLWidget> class GLWidget : public QGLWidget { Q_OBJECT public: GLWidget(QWidget *parent = 0); ~GLWidget(); protected: void initializeGL(); void paintGL(); void resizeGL(int width, int height); void mousePressEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); }; #endif
glwidget.cpp
#include <gl/glew.h> // glew must put first,and can not include QtOpenGL #include <QtGui> #include <math.h> //#include <QtOpenGL> #include "glwidget.h" GLWidget::GLWidget(QWidget *parent) : QGLWidget(parent) { } GLWidget::~GLWidget() { } void GLWidget::initializeGL() { GLenum isOK = glewInit(); glClearColor(0.2f, 0.2f, 0.4f, 1.f); } void GLWidget::paintGL() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } void GLWidget::resizeGL(int width, int height) { glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); double halfW = width / 2.0; double halfH = height / 2.0; glOrtho(-halfW, halfW, -halfH, +halfH, 4.0, 100.0); glMatrixMode(GL_MODELVIEW); } void GLWidget::mousePressEvent(QMouseEvent *event) { } void GLWidget::mouseReleaseEvent(QMouseEvent *event) { } void GLWidget::mouseMoveEvent(QMouseEvent *event) { }
將glwidget.h glwidget.cpp添加到qtglewtest0項目中,工程,右鍵 添加 現有項

選擇glwidget.h glwidget.cpp
4.添加完成后提升centerWidget,在Qt designer中操作,提升是把某個ui中的對象通過交互操作設置為新的類,這里centralWidget缺省是QWidget,我們要把它設置為上面的GLWidget

彈出的對話框

在提升的類名稱中填GLWidget, 注意大小寫,然后添加,然后在列表中勾選,單擊提升
這樣,我們就看到了centralWidget類變為GLWidget
注意保存qtglewtest0.ui

5. 現在我們來生成,然后運行,可以看到下面的海藍色的OpenGL窗口,這種藍的rgb是0.2 0.2 0.4 也是OpenSceneGraph的缺省clearcolor顏色

注:glwidget中主要的三個重寫的函數是
void initializeGL();
void resizeGL(int width, int height);
void paintGL();
initializeGL調用glewInit初始化,然后一些opengl API設置例如
清屏用的顏色,enable一些狀態,深度測試初始值等等
然后窗戶尺寸會變一次,這里設置glViewport, 視口設為和屏幕寬高一致,然后設置投影矩陣
