Qt+VC2010+glew環境安裝配置

  • 2019 年 10 月 19 日
  • 筆記

      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:mclibglew-2.1.0,  配置qtglewtest0工程屬性中的 

include目錄  添加 D:mclibglew-2.1.0include

鏈接/常規/附加庫目錄 添加 D:mclibglew-2.1.0libReleaseWin32

鏈接/輸入 添加 

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, 視口設為和螢幕寬高一致,然後設置投影矩陣

 

 

 

   

Tags: