Windows7下Qt項目添加OpenGL

Windows7下Qt項目添加OpenGL

前幾日需要在已有的Qt項目中添加OpenGL,嘗試許多方法均不得其解,最後竟然發現問題出自最初Qt項目建立上!!!
我是用的是Qt4.8.4版本,在Vs2010下建立OpenGL項目時最初需要選擇OpenGL模塊,但是最開始建立Qt項目時沒有對OpenGL模塊進行勾選,導致現在嘗試多法均不得解決,讓我頭疼好幾天!
Qt自帶OpenGL模塊,在建立Qt項目時,有如下步驟:

這裏寫圖片描述這裏寫圖片描述
後面的就可以默認啦!
對於最初沒有添加OpenGL的項目,在主項目的QtProjectSetting裏面設置OpenGL模塊,勾選上就可以了。如下圖所示:
這裏寫圖片描述
這樣以來Qt項目就包含OpenGL模塊了。
值得注意的是,在最後在建立的Qt類中,對於是不是Gui類都無所謂,OpenGl都是支持的,在要在頭文件上添加qgl.h和QtOpenGl/glut.h就可以了。建立的類的Base類一定要爲QGLWidget類,它的一些虛函數也可以重寫。

#ifndef SDPLAYER_H
#define SDPLAYER_H

#include <qgl.h>
#include <QtOpenGL/glut.h>
#include <QKeyEvent>
#include "ui_sdplayer.h"

class SDPlayer : public QGLWidget
{
    Q_OBJECT

public:
    SDPlayer(QWidget *parent = 0);
    ~SDPlayer();
protected:
    void initializeGL();
    void paintGL();
    void resizeGL(int width, int height);
    void keyPressEvent(QKeyEvent *e);
    bool fullscreen;

private:
    Ui::SDPlayer ui;
};

#endif // SDPLAYER_H

.cpp

#include "sdplayer.h"

SDPlayer::SDPlayer(QWidget *parent)
    : QGLWidget(parent)
{
    ui.setupUi(this);
}

SDPlayer::~SDPlayer()
{

}
void SDPlayer::initializeGL()
{
    setGeometry(300, 150, 640, 480);//設置窗口初始位置和大小
    glShadeModel(GL_FLAT);//設置陰影平滑模式
    glClearColor(0.5, 1.0, 0.2, 0);//改變窗口的背景顏色,不過我這裏貌似設置後並沒有什麼效果
    glClearDepth(1.0);//設置深度緩存
    glEnable(GL_DEPTH_TEST);//允許深度測試
    glDepthFunc(GL_LEQUAL);//設置深度測試類型
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);//進行透視校正
}

void SDPlayer::paintGL()
{
    //glClear()函數在這裏就是對initializeGL()函數中設置的顏色和緩存深度等起作用
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();//重置當前的模型觀察矩陣?不是很理解!
}

//該程序是設置opengl場景透視圖,程序中至少被執行一次(程序啓動時).
void SDPlayer::resizeGL(int width, int height)
{
    if(0 == height)
        height = 1;//防止一條邊爲0
    glViewport(0, 0, (GLint)width, (GLint)height);//重置當前視口,本身不是重置窗口的,只不過是這裏被Qt給封裝好了
    glMatrixMode(GL_PROJECTION);//選擇投影矩陣
    glLoadIdentity();//重置選擇好的投影矩陣
    // gluPerspective(45.0, (GLfloat)width/(GLfloat)height, 0.1, 100.0);//建立透視投影矩陣
    //glMatirxMode(GL_MODELVIEW);//以下2句和上面出現的解釋一樣
    glLoadIdentity();


}
void SDPlayer::keyPressEvent(QKeyEvent *e)
{
    switch(e->key())
    {
        //F1鍵爲全屏和普通屏顯示切換鍵
    case Qt::Key_F1:
        fullscreen = !fullscreen;
        if(fullscreen)
            showFullScreen();
        else
        {
            setGeometry(300, 150, 640, 480);
            showNormal();
        }
        updateGL();
        break;
        //Ese爲退出程序鍵
    case Qt::Key_Escape:
        close();
    }
}

最後效果如下:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章