QT+OpenGL實(shí)現(xiàn)簡(jiǎn)單圖形的繪制
繼承于QOpenGLWindow,描畫出來(lái)。新建類myopengl,頭文件如下:
#ifndef MYOPENGL_H #define MYOPENGL_H #include <QWidget> #include <QOpenGLWidget> #include <QOpenGLWindow> #include <QGLWidget> #include <QGLFunctions> #include <QOpenGLFunctions> #include <QtOpenGL> #include <QOpenGLBuffer> #include <QOpenGLShaderProgram> #include <QMatrix4x4> #include <GL/glu.h> 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 <QImage> #include <QDebug> 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" ) ) { 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 <QGuiApplication> #include <QPushButton> 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(); }
效果圖:
這么簡(jiǎn)單的效果用了就走了好多彎路。跟QT的版本有關(guān)系。有的人用的是QOpenGLWindow,有的人用的是QOpenGLWidget。聽說(shuō)推薦用的是QOpenGLWidget
到此這篇關(guān)于QT+OpenGL實(shí)現(xiàn)簡(jiǎn)單圖形的繪制的文章就介紹到這了,更多相關(guān)QT OpenGL繪制圖形內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)推箱子項(xiàng)目
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)推箱子項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08c++?qt自定義搜索編輯框的實(shí)現(xiàn)方法
這篇文章主要介紹了c++?qt自定義搜索編輯框,通過(guò)自定義QLineEdit,在編輯框里添加布局,將按鈕設(shè)置在右邊,當(dāng)點(diǎn)擊按鈕搜索按鈕時(shí)發(fā)送信號(hào)到主界面做相應(yīng)的操作,需要的朋友可以參考下2022-03-03codeblocks 對(duì)‘cv::waitKey(int)’未定義的引用方式
今天小編就為大家分享一篇codeblocks 對(duì)‘cv::waitKey(int)’未定義的引用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12C/C++ 中sizeof(''a'')對(duì)比詳細(xì)介紹
這篇文章主要介紹了C/C++ 中sizeof('a')的值對(duì)比詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2017-02-02C語(yǔ)言運(yùn)用函數(shù)的遞歸實(shí)現(xiàn)漢諾塔
遞歸(recursive)函數(shù)是“自己調(diào)用自己”的函數(shù),無(wú)論是采用直接或間接調(diào)用方式。間接遞歸意味著函數(shù)調(diào)用另一個(gè)函數(shù)(然后可能又調(diào)用第三個(gè)函數(shù)等),最后又調(diào)用第一個(gè)函數(shù)。因?yàn)楹瘮?shù)不可以一直不停地調(diào)用自己,所以遞歸函數(shù)一定具備結(jié)束條件2022-07-07基于C語(yǔ)言的開源csv解析庫(kù)MiniCSV的使用示例
這篇文章主要為大家詳細(xì)介紹了基于C語(yǔ)言中的開源csv解析庫(kù)——MiniCSV的使用示例,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-07-07