Qt浅谈之五十一QT_OpenGL

一、简介

          最近想了解些Qt的OpenGL编程,可能以后会使用。Opengl是对2D和3D图形支持很好,有非常多的优化函数,而且是个跨平台的开源库。Qt的Opengl封装的很好,通过Qt的QGLWidget类,将opengl的函数和Qt的界面结合了起来。所以使用Qt开发opengl的界面类都继承自QGLWidget,如class GLWidget : public QGLWidget。

二、详解

1、代码

在pro文件中增加QT += opengl
(1)widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QtOpenGL/QtOpenGL>

class GLWidget : public QGLWidget
{
    Q_OBJECT
public:
    GLWidget(QWidget *parent = 0, const QGLWidget * shareWidget = 0, Qt::WindowFlags f = 0);
    ~GLWidget();
signals:

public slots:

protected:
    void initializeGL();
    void paintGL();
    void resizeGL(int width, int height);
    void mouseDoubleClickEvent( QMouseEvent *event );
    void keyPressEvent(QKeyEvent *e);
private:
    GLfloat Point[5][3];

};

#endif // WIDGET_H
(2)widget.cpp
#include "widget.h"
const GLfloat PI = 3.1415926536f;

GLWidget::GLWidget(QWidget * parent, const QGLWidget * shareWidget, Qt::WindowFlags f)
{
    setMinimumSize(320,240);
    resize(640,480);
    setWindowTitle(tr("第一个OpenGL程序"));
    short angle = 18;
    for(short i=0; i<5; i++) {
        Point[i][0] = cos(angle * PI/180);
        Point[i][1] = sin(angle * PI/180);
        Point[i][2] = 0.0;
        angle += 72;
    }
}
GLWidget::~GLWidget()
{
}
void GLWidget::initializeGL()
{
    glShadeModel(GL_SMOOTH);
    glClearColor(0.5f, 0.5f, 0.5f, 0.0f);
    glClearDepth(1.0);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, Point);
}
void GLWidget::paintGL()
{
    qDebug()<<"----------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();
    glTranslatef(  3.0,  0.0,  0.0 );

    //glDrawArrays(GL_LINE_LOOP, 0, 5);

    glBegin(GL_LINE_LOOP);
        glArrayElement(1);
        glArrayElement(4);
        glArrayElement(2);
        glArrayElement(0);
        glArrayElement(3);
    glEnd();
}
void GLWidget::resizeGL(int width, int height)
{
    glViewport( 0, 0, (GLint)width, (GLint)height );
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    gluPerspective( 45.0, (GLfloat)width/(GLfloat)height, 0.1, 100.0 );
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
}
void GLWidget::mouseDoubleClickEvent( QMouseEvent *event )
{
    if(windowState() &  Qt::WindowFullScreen)
        showNormal();
    else
        showFullScreen();
}
void GLWidget::keyPressEvent(QKeyEvent *e)
{
    if (e->key() == Qt::Key_Escape)
        close();
}

(3)main.cpp
#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
    GLWidget w;
    w.show();

    return a.exec();
}

2、Qt的Opengl教程

参考网站: http://qiliang.net/old/nehe_qt/require.html
参考NeHe的OpenGL教程: http://nehe.gamedev.net/

Qt OpenGL的准备工作

第一课:创建一个OpenGL窗口

第二课:你的第一个多边形

第三课:上色

第四课:旋转

第五课:向三维进军

第六课:纹理映射

第七课:纹理滤波、光源和键盘控制

第八课:融合

第九课:在三维空间中移动位图

第十课:载入一个三维世界并在其中移动

第十一课:旗的效果(波动纹理)

第十二课:显示列表

第十三课:位图字体

第十四课:轮廓字体

第十五课:使用纹理映射的轮廓字体

第十六课:看起来很棒的雾

三、总结

(1)上述代码仅是测试代码,主要是存放网络上的一些参考教程,以便以后的查阅。
(2)测试代码已上传到csdn :http://download.csdn.net/detail/taiyang1987912/9507466

(2)若有问题或建议,请留言,在此感谢!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乌托邦2号

博文不易,支持的请给予小小打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值