近期由於需要做乙個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環境。...