歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

QT中使用OpenGL繪圖

在之前說道過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教程

Copyright © Linux教程網 All Rights Reserved