QT+OpenGL 描绘简单图形

初学opengl,绕了很多弯路,继承于QOpenGLWindow,描画出来。新建类myopengl,头文件如下:

1#ifndef MYOPENGL_H 2#define MYOPENGL_H 3 4#include <QWidget> 5#include <QOpenGLWidget> 6#include <QOpenGLWindow> 7#include <QGLWidget> 8#include <QGLFunctions> 9#include <QOpenGLFunctions> 10#include <QtOpenGL> 11#include <QOpenGLBuffer> 12#include <QOpenGLShaderProgram> 13#include <QMatrix4x4> 14#include <GL/glu.h> 15 16 17class myopenGL:public QOpenGLWindow, protected QOpenGLFunctions 18{ 19 Q_OBJECT 20 public: 21 explicit myopenGL(QWindow *parent = 0); 22 ~myopenGL(); 23 24 25 protected: 26 void initializeGL() override; 27 void paintGL() override; 28 void resizeGL(int width, int height) override; 29 void loadGLTextures(); 30 protected: 31 GLfloat rTri; 32 GLfloat rQuad; 33 GLfloat xRot, yRot, zRot; 34 GLuint texture[1]; 35 private: 36 37 38 39 40 41}; 42 43#endif // MYOPENGL_H

myopengl.cpp 代码如下:

1#include "myopengl.h" 2 3#include <QImage> 4#include <QDebug> 5 6myopenGL::myopenGL(QWindow *parent) 7{ 8 rTri = 0.0; 9 rQuad = 0.0; 10 xRot = yRot = zRot = 0.0; 11} 12 13myopenGL::~myopenGL() 14{ 15 16} 17void myopenGL::loadGLTextures() 18{ 19 QImage tex, buf; 20 if ( !buf.load( "./msbg_blue.png" ) ) 21 { 22 qWarning( "Could not read image file, using single-color instead." ); 23 QImage dummy( 128, 128, QImage::Format_RGB32 ); 24 dummy.fill( Qt::green ); 25 buf = dummy; 26 } 27 tex = QGLWidget::convertToGLFormat( buf ); 28 29 glGenTextures( 1, &texture[0] ); 30 31 glBindTexture( GL_TEXTURE_2D, texture[0] ); 32 glTexImage2D( GL_TEXTURE_2D, 0, 3, tex.width(), tex.height(), 0, 33 GL_RGBA, GL_UNSIGNED_BYTE, tex.bits() ); 34 35 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); 36 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); 37} 38//初始化opengl窗口部件 39void myopenGL::initializeGL() 40{ 41 initializeOpenGLFunctions(); 42 glClearColor(0.0,0.0,0.0,1.0); 43 glShadeModel(GL_SMOOTH); 44 45 glClearDepth(1.0); 46 glEnable(GL_DEPTH_TEST); 47 glDepthFunc(GL_LEQUAL); 48 glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST); 49} 50 51//绘制opengl窗口 52void myopenGL::paintGL() 53{ 54 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 55 glLoadIdentity(); 56 glTranslatef(-1.5f,0.0f,-6.0f); 57 glRotatef( rTri, 0.0, 1.0, 0.0 ); 58 glBegin(GL_TRIANGLES); 59 glColor3f( 1.0, 0.0, 0.0 ); 60 glVertex3f( 0.0, 1.0, 0.0 ); 61 glColor3f( 0.0, 1.0, 0.0 ); 62 glVertex3f( -1.0, -1.0, 1.0 ); 63 glColor3f( 0.0, 0.0, 1.0 ); 64 glVertex3f( 1.0, -1.0, 1.0 ); 65 66 glColor3f( 1.0, 0.0, 0.0 ); 67 glVertex3f( 0.0, 1.0, 0.0 ); 68 glColor3f( 0.0, 0.0, 1.0 ); 69 glVertex3f( 1.0, -1.0, 1.0 ); 70 glColor3f( 0.0, 1.0, 0.0 ); 71 glVertex3f( 1.0, -1.0, -1.0 ); 72 73 glColor3f( 1.0, 0.0, 0.0 ); 74 glVertex3f( 0.0, 1.0, 0.0 ); 75 glColor3f( 0.0, 1.0, 0.0 ); 76 glVertex3f( 1.0, -1.0, -1.0 ); 77 glColor3f( 0.0, 0.0, 1.0 ); 78 glVertex3f( -1.0, -1.0, -1.0 ); 79 80 glColor3f( 1.0, 0.0, 0.0 ); 81 glVertex3f( 0.0, 1.0, 0.0 ); 82 glColor3f( 0.0, 0.0, 1.0 ); 83 glVertex3f( -1.0, -1.0, -1.0 ); 84 glColor3f( 0.0, 1.0, 0.0 ); 85 glVertex3f( -1.0, -1.0, 1.0 ); 86 glEnd(); 87 88 glTranslatef(3.0f,0.0f,-7.0f); 89 glRotatef( rQuad, 0.0, 0.0, 1.0 ); 90 glRotatef( rTri, 0.0, 1.0, 0.0 ); 91 glRotatef( rQuad, 0.0, 0.0, 1.0 ); 92 glBegin(GL_QUADS); 93 glColor3f( 0.0, 1.0, 0.0 ); 94 glVertex3f( 1.0, 1.0, -1.0 ); 95 glVertex3f( -1.0, 1.0, -1.0 ); 96 glVertex3f( -1.0, 1.0, 1.0 ); 97 glVertex3f( 1.0, 1.0, 1.0 ); 98 99 glColor3f( 1.0, 0.5, 0.0 ); 100 glVertex3f( 1.0, -1.0, 1.0 ); 101 glVertex3f( -1.0, -1.0, 1.0 ); 102 glVertex3f( -1.0, -1.0, -1.0 ); 103 glVertex3f( 1.0, -1.0, -1.0 ); 104 105 glColor3f( 1.0, 0.0, 0.0 ); 106 glVertex3f( 1.0, 1.0, 1.0 ); 107 glVertex3f( -1.0, 1.0, 1.0 ); 108 glVertex3f( -1.0, -1.0, 1.0 ); 109 glVertex3f( 1.0, -1.0, 1.0 ); 110 111 glColor3f( 1.0, 1.0, 0.0 ); 112 glVertex3f( 1.0, -1.0, -1.0 ); 113 glVertex3f( -1.0, -1.0, -1.0 ); 114 glVertex3f( -1.0, 1.0, -1.0 ); 115 glVertex3f( 1.0, 1.0, -1.0 ); 116 117 glColor3f( 0.0, 0.0, 1.0 ); 118 glVertex3f( -1.0, 1.0, 1.0 ); 119 glVertex3f( -1.0, 1.0, -1.0 ); 120 glVertex3f( -1.0, -1.0, -1.0 ); 121 glVertex3f( -1.0, -1.0, 1.0 ); 122 123 glColor3f( 1.0, 0.0, 1.0 ); 124 glVertex3f( 1.0, 1.0, -1.0 ); 125 glVertex3f( 1.0, 1.0, 1.0 ); 126 glVertex3f( 1.0, -1.0, 1.0 ); 127 glVertex3f( 1.0, -1.0, -1.0 ); 128 glEnd(); 129 rTri += 0.2; 130 rQuad -= 0.15; 131} 132//处理窗口大小 133void myopenGL::resizeGL(int width, int height) 134{ 135 glViewport(0,0,(GLint)width,(GLint)height); 136 glMatrixMode(GL_PROJECTION); 137 glLoadIdentity(); 138 gluPerspective(45.0,(GLfloat)width/(GLfloat)height,0.1,100.0); 139 glMatrixMode(GL_MODELVIEW); //选择模型观察矩阵 140 glLoadIdentity(); //重置模型观察矩阵 141}

main.cpp修改代码如下:

1#include "myopengl.h" 2#include <QGuiApplication> 3#include <QPushButton> 4 5int main(int argc, char *argv[]) 6{ 7 QCoreApplication::setAttribute(Qt::AA_UseDesktopOpenGL); 8 QGuiApplication a(argc, argv); 9 myopenGL w; 10 w.resize(QSize(1280,720)); 11 //QPushButton ptn(&w); 12 13 w.show(); 14 15 return a.exec(); 16}

效果图:

这么简单的效果用了就走了好多弯路。跟QT的版本有关系。有的人用的是QOpenGLWindow,有的人用的是QOpenGLWidget。听说推荐用的是QOpenGLWidget。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

QT+OpenGL 描绘简单图形 - HelloWorld