首页 > 代码库 > Qt4.3.4下面创建一个OpenGL 窗口

Qt4.3.4下面创建一个OpenGL 窗口

直接上代码:

NeHeWidget.h

#include <QtOpenGL/qgl.h>

class NeHeWidget:public QGLWidget
{
Q_OBJECT

public:
    NeHeWidget( QWidget* parent=0 );
    ~NeHeWidget();
    
protected:
    void initializeGL();
    void paintGL();
    void resizeGL(int width,int height);
    
};

NeHeWidget.cpp

#include "NeHeWidget.h"

NeHeWidget::NeHeWidget( QWidget* parent )
    :QGLWidget( parent )
{
    setGeometry( 50,50,640,480 );
    setWindowTitle( "OpenGL Framework" );//setCaption( "OpenGL Framework" );
}


NeHeWidget::~NeHeWidget()
{}


void NeHeWidget::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 );
                                        //进行最好的透视修正
}


//任何你想在屏幕上显示的东东都将在此段代码中出现。
//此函数包括了所有的绘图代码。

//如果你了解OpenGL,可以在glLoadIdentity()调用之后,函数返回之前
//,试着添加一些OpenGL代码来创建基本的图形

void NeHeWidget::paintGL()
{
    //将屏幕清除城我们前面所决定的颜色,清除深度缓存并重置场景
    glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT );
        //清除屏幕和深度缓存
    glLoadIdentity();
        //重置当前的模型观察矩阵

}


void NeHeWidget::resizeGL( int width,int height )
{
    if( height==0 )
    {
        height=1;    //防止height=0;
    }
    
    glViewport( 0,0,(GLint)width,(GLint)height );        //重置当前视口(Viewport)
    glMatrixMode( GL_PROJECTION );                        //选择投影矩阵
    glLoadIdentity();                                    //重置投影矩阵
    
    //glPerspective( 45.0,(GLfloat)width/(GLfloat)height,0.1,100.0 );        //建立透视投影矩阵
    gluPerspective( 45.0, (GLfloat)width/(GLfloat)height, 0.1, 100.0 );
    
    //glMatrixModel( GL_MODELVIEW );                        //选择模型观察矩阵
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();                                    //重置模型观察矩阵
    
}

main.cpp

#include <QApplication>
#include "NeHeWidget.h"

int main( int argc,int argv[] )
{
    bool fs=true;
    QApplication app( argc,(char**)&argv[0] );
    NeHeWidget w(0);
    //app.setMainWidget(&w);        //Qt 3.x支持setMainWidget,但是Qt4已经取消了对setMainWidget的支持。
    w.show();
    return app.exec();
}