在之前說道過VS2010中配合OpenGL繪圖的問題,這回是想要說說在QT中使用OpenGL,其實兩者並無太大區別,因為都是基於C++語言的。
相關閱讀:VS2010搭建OpenGL環境 http://www.linuxidc.com/Linux/2012-12/75454.htm
主要是想簡要介紹下OpenGL在QT中的使用方法跟一些錯誤。
glwidget.h //繼承自QGLWidget,用來實現OpenGL相關的操作以及繪圖操作
#ifndef GLWIDGET_H
#define GLWIDGET_H
#include <QtOpenGL>
#include <QWidget>
namespace Ui {
class GLWidget;
}
class GLWidget : public QGLWidget
{
Q_OBJECT
public:
explicit GLWidget(QGLWidget *parent = 0);
~GLWidget();
protected:
void initializeGL(); //初始化OpenGL窗口部件
void paintGL(); //繪制整個OpenGL窗口,只要有更新發生,這個函數就會被調用
void resizeGL(int width, int height); //處理窗口大小變化事件的,參數是新狀態下的寬和高
void keyPressEvent(QKeyEvent *e); //鼠標處理函數
protected:
bool fullscreen; //判斷是否全屏的變量
private:
Ui::GLWidget *ui;
};
#endif // GLWIDGET_H
glwidget.cpp //glwidget.h的源文件
#include "glwidget.h"
#include "ui_glwidget.h"
#include <QtGui>
#include <QtCore>
#include <QtOpenGL>
GLWidget::GLWidget(QGLWidget *parent) :
QGLWidget(parent),
ui(new Ui::GLWidget)
{
ui->setupUi(this);
fullscreen = false;
}
//這是對虛函數,這裡是重寫該函數
void GLWidget::initializeGL()
{
setGeometry(300, 200, 640, 480);//設置窗口初始位置和大小
glShadeModel(GL_FLAT);//設置陰影平滑模式
glClearColor(0.0, 0.0, 0.0, 0);//改變窗口的背景顏色
glClearDepth(1.0);//設置深度緩存
glEnable(GL_DEPTH_TEST);//允許深度測試
glDepthFunc(GL_LEQUAL);//設置深度測試類型
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);//進行透視校正
}
void GLWidget::paintGL()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glLoadIdentity();
//renderText(10,20,"Hello,My Dear");
// glColor3f(1.0, 0.0, 0.0);
/*
glBegin(GL_TRIANGLES);
glVertex3f(0.0, 1.0, 0.0);
glVertex3f(-1.0, -1.0, 0.0);
glVertex3f(1.0, -1.0, 0.0);
glEnd();
*/
glBegin(GL_TRIANGLES);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 1.0f, 0.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, 0.0f);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(1.0f, -1.0f, 0.0f);
glEnd();
renderText(20, 100, "Hello Jcy, My first OpenGL app.");
}
//該程序是設置opengl場景透視圖,程序中至少被執行一次(程序啟動時).
void GLWidget::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 GLWidget::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();
}
}
GLWidget::~GLWidget()
{
delete ui;
}
main.cpp //原始cpp文件,未改變
#include <QtGui/QApplication>
#include "glwidget.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
GLWidget w;
w.show();
return a.exec();
}
說明:
(1) 繪圖工作:
voidGLWidget::paintGL()
這個是主要的繪圖函數,整個的繪圖工作都在這個裡面。
(2) 坐標點:
OpenGL的坐標點的范圍-1到1。
(3) 如何在OpenGL圖形周圍寫字:
renderText(20,100,"HelloJcy,MyfirstOpenGLapp.");
第一個跟第二個參數是坐標位置,第三個是需要顯示的字。
可能出現的錯誤:
(1)錯誤:C1083: Cannot open include file: 'QtOpenGL': No such file or directory
如果你是這個錯誤,那麼你需要在.pro文件中添加QT += opengl
(2)錯誤:C2504: 'QGLWidget' : base class undefined
如果你是這個錯誤,那麼請你在.h文件中添加 #include<QtOpenGL>
(3)錯誤:C2039: 'show' : is not a member of 'GLWidget'
如果你是這個錯誤,那麼請你在.h文件中添加 #include<QtOpenGL>
上面的代碼參考了Qt_OpenGL教程