QT+OpenGL实现简单图形的绘制 - 网站

QT+OpenGL实现简单图形的绘制

分类:C语言 · 发布时间:2023-10-07 18:55 · 阅读:4168

这篇文章主要为大家详细介绍了如何利用QT和OpenGL实现简单图形的绘制,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下

继承于QOpenGLWindow,描画出来。新建类myopengl,头文件如下:

#ifndef MYOPENGL_H #define MYOPENGL_H #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  class myopenGL:public QOpenGLWindow, protected QOpenGLFunctions { Q_OBJECT public: explicit myopenGL(QWindow *parent = 0); ~myopenGL(); protected: void initializeGL() override; void paintGL() override; void resizeGL(int width, int height) override; void loadGLTextures(); protected: GLfloat rTri; GLfloat rQuad; GLfloat xRot, yRot, zRot; GLuint texture[1]; private: }; #endif // MYOPENGL_H

myopengl.cpp 代码如下:

#include "myopengl.h" #include  #include  myopenGL::myopenGL(QWindow *parent) { rTri = 0.0; rQuad = 0.0; xRot = yRot = zRot = 0.0; } myopenGL::~myopenGL() { } void myopenGL::loadGLTextures() { QImage tex, buf; if ( !buf.load( "./msbg_blue.png-600" ) ) { qWarning( "Could not read image file, using single-color instead." ); QImage dummy( 128, 128, QImage::Format_RGB32 ); dummy.fill( Qt::green ); buf = dummy; } tex = QGLWidget::convertToGLFormat( buf ); glGenTextures( 1, &texture[0] ); glBindTexture( GL_TEXTURE_2D, texture[0] ); glTexImage2D( GL_TEXTURE_2D, 0, 3, tex.width(), tex.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tex.bits() ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); } //初始化opengl窗口部件 void myopenGL::initializeGL() { initializeOpenGLFunctions(); glClearColor(0.0,0.0,0.0,1.0); glShadeModel(GL_SMOOTH); glClearDepth(1.0); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST); } //绘制opengl窗口 void myopenGL::paintGL() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(-1.5f,0.0f,-6.0f); glRotatef( rTri,  0.0,  1.0,  0.0 ); glBegin(GL_TRIANGLES); glColor3f( 1.0, 0.0, 0.0 ); glVertex3f(  0.0,  1.0,  0.0 ); glColor3f( 0.0, 1.0, 0.0 ); glVertex3f( -1.0, -1.0,  1.0 ); glColor3f( 0.0, 0.0, 1.0 ); glVertex3f(  1.0, -1.0,  1.0 ); glColor3f( 1.0, 0.0, 0.0 ); glVertex3f(  0.0,  1.0,  0.0 ); glColor3f( 0.0, 0.0, 1.0 ); glVertex3f(  1.0, -1.0,  1.0 ); glColor3f( 0.0, 1.0, 0.0 ); glVertex3f(  1.0, -1.0, -1.0 ); glColor3f( 1.0, 0.0, 0.0 ); glVertex3f(  0.0,  1.0,  0.0 ); glColor3f( 0.0, 1.0, 0.0 ); glVertex3f(  1.0, -1.0, -1.0 ); glColor3f( 0.0, 0.0, 1.0 ); glVertex3f( -1.0, -1.0, -1.0 ); glColor3f( 1.0, 0.0, 0.0 ); glVertex3f(  0.0,  1.0,  0.0 ); glColor3f( 0.0, 0.0, 1.0 ); glVertex3f( -1.0, -1.0, -1.0 ); glColor3f( 0.0, 1.0, 0.0 ); glVertex3f( -1.0, -1.0,  1.0 ); glEnd(); glTranslatef(3.0f,0.0f,-7.0f); glRotatef( rQuad,  0.0,  0.0,  1.0 ); glRotatef( rTri,  0.0,  1.0,  0.0 ); glRotatef( rQuad,  0.0,  0.0,  1.0 ); glBegin(GL_QUADS); glColor3f( 0.0, 1.0, 0.0 ); glVertex3f(  1.0,  1.0, -1.0 ); glVertex3f( -1.0,  1.0, -1.0 ); glVertex3f( -1.0,  1.0,  1.0 ); glVertex3f(  1.0,  1.0,  1.0 ); glColor3f( 1.0, 0.5, 0.0 ); glVertex3f(  1.0, -1.0,  1.0 ); glVertex3f( -1.0, -1.0,  1.0 ); glVertex3f( -1.0, -1.0, -1.0 ); glVertex3f(  1.0, -1.0, -1.0 ); glColor3f( 1.0, 0.0, 0.0 ); glVertex3f(  1.0,  1.0,  1.0 ); glVertex3f( -1.0,  1.0,  1.0 ); glVertex3f( -1.0, -1.0,  1.0 ); glVertex3f(  1.0, -1.0,  1.0 ); glColor3f( 1.0, 1.0, 0.0 ); glVertex3f(  1.0, -1.0, -1.0 ); glVertex3f( -1.0, -1.0, -1.0 ); glVertex3f( -1.0,  1.0, -1.0 ); glVertex3f(  1.0,  1.0, -1.0 ); glColor3f( 0.0, 0.0, 1.0 ); glVertex3f( -1.0,  1.0,  1.0 ); glVertex3f( -1.0,  1.0, -1.0 ); glVertex3f( -1.0, -1.0, -1.0 ); glVertex3f( -1.0, -1.0,  1.0 ); glColor3f( 1.0, 0.0, 1.0 ); glVertex3f(  1.0,  1.0, -1.0 ); glVertex3f(  1.0,  1.0,  1.0 ); glVertex3f(  1.0, -1.0,  1.0 ); glVertex3f(  1.0, -1.0, -1.0 ); glEnd(); rTri += 0.2; rQuad -= 0.15; } //处理窗口大小 void myopenGL::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();                   //重置模型观察矩阵 }

main.cpp修改代码如下:

#include "myopengl.h" #include  #include  int main(int argc, char *argv[]) { QCoreApplication::setAttribute(Qt::AA_UseDesktopOpenGL); QGuiApplication a(argc, argv); myopenGL w; w.resize(QSize(1280,720)); //QPushButton ptn(&w); w.show(); return a.exec(); }

效果图:

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

到此这篇关于QT+OpenGL实现简单图形的绘制的文章就介绍到这了,更多相关QT OpenGL绘制图形内容请搜索0133技术站以前的文章或继续浏览下面的相关文章希望大家以后多多支持0133技术站!

标签:
QT OpenGL 图形

相关文章

C/C++预处理浅析使用形式

预处理是指在进行编译的词法扫描和语法分析之前所作的工作。预处理指令指示在程序正式编译前就由编译器进行的操作,可放在程序中任何位置。处理完毕自动进入对源程序的编译。C/C++中的预处理主要包含三种:文件包含、宏定义、条件编译

C++中的字符串编码处理方法

这篇文章主要介绍了C++中的字符串编码处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

C++中的强制类型转换操作详解

C++中提供了四种强制类型转换技术:static_cast、dynamic_cast、reinterpret_cast和const_cast。这些技术能够在需要时将一种类型转换为另一种类型,但需要注意它们的适用条件和安全性。程序员需要根据具体情况选择合适的强制类型转换方式,以确保程序的正确性和可靠性

C语言之结构体定义 typedef struct 用法详解和用法小结

这篇文章主要介绍了C语言的结构体定义typedef struct用法详解和用法小结,typedef是类型定义,typedef struct 是为了使用这个结构体方便,感兴趣的同学可以参考阅读

C++报错:Id returned 1exit status的解决办法

最近刚学c语言,不止一次遇到了同一种报错,经过总结分享给大家,下面这篇文章主要给大家介绍了关于C++报错:Id returned 1exit status的解决办法,需要的朋友可以参考下

返回分类 返回首页