QT中使用OpenGL绘制图形
Qt Creator中的3D繪圖及動畫教程(參照NeHe)
剛剛學習了Qt Creator,發現Qt提供了QtOpenGL模塊,對OpenGL做了不錯的封裝,這使得我們可以很輕松地在Qt程序中使用OpenGL進行繪圖渲染。雖然里面還是由不少專業的解釋照搬原文的,但還是加入了大量自己的分析。而且Qt中寫OpenGL框架上比VC簡單太多了,有不少東西都封裝優化好了,代碼上還是由有很多區別的。當然,其中原教程沒解釋好的問題我都作了深入的解釋,以及一些多余部分解釋、代碼都被我刪掉簡化了。
這份Qt OpenGL的3D繪圖及動畫教程,我基本會按照Nehe的OpenGL教程,只是將代碼的實現運用到Qt Creator中,當然其中加了。
下面對Qt中OpenGL做一個簡要介紹:
Qt中OpenGL主要是在QGLWidget類中完成的,而要使用QtOpenGL模塊,需要在項目文件( .pro)中添加代碼"QT+=opengl"。
QGLWidget類是一個用來渲染OpenGL圖形的部件,提供了在Qt中顯示OpenGL圖形的功能。這個類使用起來很簡單,只需要繼承該類,然后像使用其他QWidget部件一樣來使用它。QGLWidget提供了3個方便的純虛函數,可以在子類中通過重新實現它們來執行典型的OpenGL任務:
initializeGL():設置OpenGL渲染環境,定義顯示列表等。該函數只在第一次調用resizeGL()或paintGL()前被自動調用一次。
resizeGL():設置OpenGL的視口、投影等。每次部件改變大小時都會自動調用該函數。
paintGL():渲染OpenGL場景。每當部件需要更新時都會調用該函數。
(以上3個虛函數更具體的調用情況我會用另一篇文章來講明)
也就是說,Qt中當創建并顯示出一個QGLWidget子對象時,會自動依次調用initializeGL()、resizeGL()、paintGL(),完成當前場景的繪制;而當某些情況發生時,會根據情況決定是否自動調用initializeGL()、resizeGL(),一旦調用initializeGL()、resizeGL()了,會緊跟著調用paintGL()對場景進行重新繪制。
實例//*********
在之前說道過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教程
總結
以上是生活随笔為你收集整理的QT中使用OpenGL绘制图形的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 想要转人工智能,程序员该如何学习?(学习
- 下一篇: 解决:mysql 连接报错 Authen