阅读背景:

Qt中第一个Opengl程序

来源:互联网 

1. 目的:在Qt中使用Opengl函数绘制一个三角形;

2. 实现如下:

// myQtOpenglWindow.h
#ifndef MYQTOPENGLWINDOW_H
#define MYQTOPENGLWINDOW_H
#include <QtOpenGL/QtOpenGL>
#include <QtOpenGL/QGLWidget>
#include <QWidget>
class myQtOpenglWindow : public QGLWidget
{
    Q_OBJECT
public:
    explicit myQtOpenglWindow( QWidget* parent = 0, const char* name = 0, bool fs = false );\
    ~myQtOpenglWindow();

protected:
    void initializeGL();
    void paintGL();
    void resizeGL( int width, int height );
    void keyPressEvent(QKeyEvent *);

protected:
    bool fullScreen;

signals:

public slots:

};

#endif // MYQTOPENGLWINDOW_H

// myQtOpenglWindow.cpp
#include "myqtopenglwindow.h"
#include <gl/GLU.h>
myQtOpenglWindow::myQtOpenglWindow( QWidget* parent, const char* name, bool fs )
    :QGLWidget( parent )
{
     //保存窗口是否为全屏的状态。
    fullScreen = fs;

    //设置窗口的位置,即左上角为(0,0)点,大小为640*480。
    setGeometry( 0, 0, 640, 480 );

    // 设置窗口的标题为“My's OpenGL Framework”。
    //setCaption( "My's OpenGL Framework" );

    // 如果fullscreen为真,那么就全屏显示这个窗口。
    if ( fullScreen )
    {
        showFullScreen();
    }


}

myQtOpenglWindow::~myQtOpenglWindow()
{

}

void myQtOpenglWindow::initializeGL()
{
    glShadeModel(GL_SMOOTH);
    glClearColor( 0.0, 0.0, 0.0, 0.0 );
    glClearDepth( 1.0 );
    glEnable( GL_DEPTH_TEST );
    glDepthFunc( GL_LEQUAL );
    glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );

    return;
}

void myQtOpenglWindow::paintGL()
{
     glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    glLoadIdentity();
    glTranslatef(-1.5,0.0,-6.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();
    return;
}

void myQtOpenglWindow::resizeGL(int width, int height)
{
    //防止height为0
    if( height == 0 )
    {
        height =1;
    }
    //重置当前的视口(Viewport)
    glViewport( 0, 0, (GLint)width, (GLint)height );

    //选择投影矩阵。
    glMatrixMode( GL_PROJECTION );

    //重置投影矩阵
    glLoadIdentity();

    //建立透视投影矩阵
    gluPerspective( 45.0, (GLfloat)width/(GLfloat)height, 0.1, 100.0 );
    //gluPerspective(45.0,(GLfloat)width() / (GLfloat)height(),0.1,100.0);
    // 选择模型观察矩阵
    glMatrixMode( GL_MODELVIEW );

    // 重置模型观察矩阵。
    glLoadIdentity();

    return;
}

void myQtOpenglWindow::keyPressEvent(QKeyEvent * e)
{
    switch ( e->key() )
    {
        //如果按下了F2键,那么屏幕是否全屏的状态就切换一次。然后再根据需要,显示所要的全屏窗口或者

普通窗口。
        case Qt::Key_F2:
            fullScreen = !fullScreen;

            if ( fullScreen )
            {
                showFullScreen();
            }
            else
            {
                showNormal();
                setGeometry( 0, 0, 640, 480 );
            }

            updateGL();
            break;

        //如果按下了Escape键,程序退出。
        case Qt::Key_Escape:
            close();
    }

    return;
}

执行:
 myQtOpenglWindow *poglwindow = new myQtOpenglWindow;
    poglwindow->show();
即可显示Opengl窗口,其中有一个三角形
//



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: