QT中OpenGL開發起步

2021-08-18 16:18:43 字數 4630 閱讀 2059

近期由於需要做乙個gui展示的opengl程式,因此想到用qt來做介面,需要在qt中寫opengl,配完環境後,在這裡總計一下。

總體看來,qt的版本較為混亂,有時候傻傻弄不清楚,qt dialog/widget/mainwindow。又需要有介面,又要有pro檔案,一圈下來,加上網上教程版本混亂,已經凌亂了。後來在同學幫助下,看了一些部落格教程,綜合了一下,總算把架子搭起來了。本文使用的版本資訊如下:

qt版本:qt 5.6.2

vs版本:vs 2013

工程選擇:

本文選擇的是qt的widgt類別,qt各個類別的區別在於繼承於不同的基類,正常的widgt是最基礎的,不預設含有選單欄這些東西,需要的話我們自己新增。選擇建立工程時不建立ui檔案,在程式設計中發現使用ui檔案會較為混亂,不方便控制,因此**中所有的ui都是由**控制的。以下是**結構:

// main.cpp

#include "widget.h"

#include

int main(int argc, char *argv)

例項化button的效果:

所以,主要的工作就是往我們的widget類中新增控制項,實現功能即可。主widget**如下,繼承自qweidget:

class widget : public qwidget

;

qt中為我們把opengl進行了封裝,使用較原生opengl簡單

在qt中寫opengl需要繼承自qopenglwidget,同時重寫兩個函式initializegl【初始化opengl環境】和paintgl【主繪畫的迴圈】。相對於原生的opengl複雜的初始化和繪製過程,十分簡潔。以下是標頭檔案和部分源**。

// .h

class q_opengl:public qopenglwidget,protected qopenglfunctions

;// .cpp

// 初始化opengl

void q_opengl::initializegl()

// 編譯shader

void q_opengl::compileshader()

vs.close();

}vs.open("e:\\documents\\qt\\qtwindows\\normal.fs");

//qdebug()<

vs.close();

}qdebug() << "hhhh"

<< endl;

qopenglshader *vshader = new qopenglshader(qopenglshader::vertex, this);

vshader->compilesourcecode(vertexcode.c_str());

qopenglshader *fshader = new qopenglshader(qopenglshader::fragment, this);

fshader->compilesourcecode(fragmentcode.c_str());

program = new qopenglshaderprogram;

program->addshader(vshader);

program->addshader(fshader);

//program->bindattributelocation("vertex", program_vertex_attribute);

//program->bindattributelocation("texcoord", program_texcoord_attribute);

program->link();

program->bind();

//program->setuniformvalue("texture", 0);

}// 傳遞資料到vbo

void q_opengl::setup()

; qvector vertdata;

for (int i = 0; i < 3; ++i)

for (int j = 0; j < 2; ++j)

vbo.create();

vbo.bind();

vbo.allocate(vertdata.constdata(), vertdata.count() * sizeof(float));

}// 主繪製函式

void q_opengl::paintgl()

以上**基本展示qt中opengl的編寫過程,**有一些不匹配,可以檢視qt官方的opengl例子即可。【我參考的是textures例子】

在使用中,發現qt中的opengl與原生差異較大,移植**會有一些問題。所以考慮將原生opengl移植到qt中,使用qt的opengl進行初始化,但在繪製,shader方面使用原生的opengl。

但在實踐中發現,qt中的opengl和原生的opengl會出現衝突,無法同時初始化。網上找了解決方案,需要將原生的opengl與qt的opengl進行隔離,不能出現在同乙個cpp中,於是將類的宣告和定義分離【==原來圖方便寫在了一起】,主要是shader編譯類,模型類。在標頭檔案中宣告,定義和初始化opengl延遲到cpp時,再將標頭檔案引入到主程式中,這樣就可以使用原生opengl

tips:在實際操作時,不知道為何glad無法初始化,改用glew才成功。以下是通過的**:

// shader.h

#ifndef shader_h

#define shader_h

#include

#include

#include

#include

#include

#include

class shader

;#endif

// shader.cpp,只列出部分

//#include

#define glew_static

#include

#include

#include

#include "shader.h"

using

namespace

std;

shader::shader(const glchar* vertexpath, const glchar* fragmentpath)

shader::~shader()

void shader::use()

// model.h

#pragma once

#include "shader.h"

class model

;// 更新後的qtopengl

#ifndef q_opengl_h

#define q_opengl_h

#include

#include

#include

#include

#include "shader.h"

#include "model.h"

qt_forward_declare_class(qopenglshaderprogram);

qt_forward_declare_class(qopengltexture)

class q_opengl:public qopenglwidget,protected qopenglfunctions

;#endif // q_opengl_h

// qopengl實現

#include "q_opengl.h"

#include

#include

#include

#include

#include

#include

#include

#include

q_opengl::q_opengl(qwidget *parent):qopenglwidget(parent)

void q_opengl::initializegl()

void q_opengl::paintgl()

q_opengl::~q_opengl()

效果圖如下:

如有問題歡迎聯絡指出~

wince開發起步

platformbuiler開發小結 platformbuilder的開發經歷了三個階段 從對platformbuilder的神秘崇拜 對拿到手的platformbuilder的艱難入門 第乙個真正完整意義上的nk.bin檔案的完成。1.同其它的相對大型的開發軟體相同,platformbuilder...

VsCoe Extension 開發起步

src scrolling no border 0 allowfullscreen true width 500 height 400 今天嘗試學習vs外掛程式,搭建環境很簡單,我是基於npm,首先安裝工具軟體 npm install g yo generator code然後,運用工具生成腳手架 ...

MeeGo手機開發起步

meego 1.0 notebook 是基於qt的麼提到notebook幾乎沒有qt的什麼應用在裡頭,不過handset版本則是實打時的qt應用,包括桌面管理器和視窗管理器,以及各種應用,你會看到qt無所不在。這篇文章就以最簡單的篇幅介紹一下如何在linux下搭建乙個meego handset環境。...