博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Qt浅谈之五十一QT_OpenGL
阅读量:4178 次
发布时间:2019-05-26

本文共 3013 字,大约阅读时间需要 10 分钟。

一、简介

          最近想了解些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 
#include
class GLWidget : public QGLWidget{ Q_OBJECTpublic: 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 
int main(int argc, char *argv[]){ QApplication a(argc, argv); QTextCodec::setCodecForTr(QTextCodec::codecForLocale()); GLWidget w; w.show(); return a.exec();}

2、Qt的Opengl教程

参考网站:参考NeHe的OpenGL教程:

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

第十三课:位图字体

第十四课:轮廓字体

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

三、总结

(1)上述代码仅是测试代码,主要是存放网络上的一些参考教程,以便以后的查阅。
(2)测试代码已上传到csdn :。
(2)若有问题或建议,请留言,在此感谢!

你可能感兴趣的文章
JAVA字符串格式化-String.format()的使用
查看>>
SpringBoot | CXF发布WebService服务和客户端调用WebService服务
查看>>
JavaBean对象转换EntityUtils工具类
查看>>
@JSONField和 @JsonFormat比较说明
查看>>
记录fastjson的使用
查看>>
SoapUI在头部传入用户名和密码
查看>>
2018 IntelliJ IDEA 常用设置
查看>>
SpringBoot | Mybatis通用mapper的分页查询
查看>>
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:SQL Server 未返回响应。连接已关闭。
查看>>
windows下mysql数据备份bat文件
查看>>
windows下oracle数据备份bat文件
查看>>
windows下sqlserver数据库备份
查看>>
SpringBoot之打包成war包部署到tomcat
查看>>
bat方式启动java jar
查看>>
windows下mysql 主主同步
查看>>
基于nginx实现web服务器的双机热备
查看>>
Linux 查看端口占用并杀掉
查看>>
bootstrap fileinput.js 文件上传 文件名称的问题
查看>>
下载时文件名的编码问题
查看>>
把文件夹的文件按时间排序
查看>>