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