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();
}
}
最后效果如下: