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();
    }
}

最后效果如下:
这里写图片描述

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