導航:首頁 > 編程語言 > qtopengl編程

qtopengl編程

發布時間:2022-04-25 00:26:59

⑴ 在Qt下如何使用OpenGL進行繪圖

Qt Creator中的3D繪圖及動畫教程(參照NeHe)
剛剛學習了Qt Creator,發現Qt提供了QtOpenGL模塊,對OpenGL做了不錯的封裝,這使得我們可以很輕松地在Qt程序中使用OpenGL進行繪圖渲染。雖然裡面還是由不少專業的解釋照搬原文的,但還是加入了大量自己的分析。而且Qt中寫OpenGL框架上比VC簡單太多了,有不少東西都封裝優化好了,代碼上還是由有很多區別的。當然,其中原教程沒解釋好的問題我都作了深入的解釋,以及一些多餘部分解釋、代碼都被我刪掉簡化了。
這份Qt OpenGL的3D繪圖及動畫教程,我基本會按照Nehe的OpenGL教程,只是將代碼的實現運用到Qt Creator中,當然其中加了。
下面對Qt中OpenGL做一個簡要介紹:
Qt中OpenGL主要是在QGLWidget類中完成的,而要使用QtOpenGL模塊,需要在項目文件( .pro)中添加代碼"QT+=opengl"。
QGLWidget類是一個用來渲染OpenGL圖形的部件,提供了在Qt中顯示OpenGL圖形的功能。這個類使用起來很簡單,只需要繼承該類,然後像使用其他QWidget部件一樣來使用它。QGLWidget提供了3個方便的純虛函數,可以在子類中通過重新實現它們來執行典型的OpenGL任務:
initializeGL():設置OpenGL渲染環境,定義顯示列表等。該函數只在第一次調用resizeGL()或paintGL()前被自動調用一次。
resizeGL():設置OpenGL的視口、投影等。每次部件改變大小時都會自動調用該函數。
paintGL():渲染OpenGL場景。每當部件需要更新時都會調用該函數。
(以上3個虛函數更具體的調用情況我會用另一篇文章來講明)
也就是說,Qt中當創建並顯示出一個QGLWidget子對象時,會自動依次調用initializeGL()、resizeGL()、paintGL(),完成當前場景的繪制;而當某些情況發生時,會根據情況決定是否自動調用initializeGL()、resizeGL(),一旦調用initializeGL()、resizeGL()了,會緊跟著調用paintGL()對場景進行重新繪制。

⑵ qtuseopengl好處

好處是容易擴展。
Qt是一個跨平台的C++應用程序開發框架。廣泛用於開發GUI程序。
Qt使用標準的C++和特殊的代碼生成擴展(稱為元對象編譯器(MetaObjectCompiler,moc))以及一些宏。通過語言綁定,其他的編程語言也可以使用Qt。

⑶ qt 和opengl是什麼關系

opengl和dx是顯卡的介面,最底層的繪圖api。

qt是跨平台gui庫。

opengl關心的是渲染等,而qt關心的是按鈕被點擊後引發什麼動作之類的。

⑷ Qt5怎樣使用OpenGL

一、Qt5中OpenGL模塊的重大更改
1
在 Qt5 中,新增了 QOpenGL* 類,用以取代之前的 QGL* 類。
注意,雖然我們仍然能通過 Qt5 中的 OpenGL 模塊使用 QGL* 類,但強烈建議大家在新的 Qt 應用程序中使用 QOpenGL* 類而不是 QGL* 類。
Qt5怎樣使用OpenGL
2
另外,在 Qt5 中,已經將 OpenGL 集成到了 Gui 模塊中。因此,我們要想使用與 OpenGL 相關的類和函數,只需要在 .pro 工程文件中包含 gui 模塊就可以了,無需像以前一樣還要包含 opengl 。
Qt5怎樣使用OpenGL
END
二、怎樣在Qt5中使用OpenGL
下面,我們來通過一個實際例子來演示怎樣在 Qt5 中使用 OpenGL。在這個例子中,為了便於大家理解,我們只創建一個簡單的背景為黑色的 OpenGL 窗口。下面是程序的運行效果圖。
Qt5怎樣使用OpenGL
首先,我們需要創建一個自定義的窗口類 Window。該類的父類有兩個:
1)QOpenGLWindow:以公有方式繼承
2)QOpenGLFunctions:以保護方式繼承
另外,在通常情況下,我們還需要實現三個從父類繼承的虛函數:
1)void initializeGL()
2)void resizeGL(int width, int height) //若無需對高、寬進行處理,此函數可省
3)void paintGL()
Qt5怎樣使用OpenGL
然後,我們來實現上面所聲明的函數。
1) initializeGL
該函數用來初始化當前的 OpenGL 環境。
注意,在此函數中,我們必須調用 initializeOpenGLFunctions(); 語句以便 Qt 在後台完成 OpenGL 環境的初始化工作。
隨後,使用 glClearColor 函數來設置清除顏色。該函數的前三個參數分別是紅、綠、藍的分量值,第四個參數為透明度值。
Qt5怎樣使用OpenGL
2)resizeGL
該函數主要用來對高度和寬度進行一些變化處理。當然,如果你沒有什麼特殊需求,也可以不處理這個函數。
Qt5怎樣使用OpenGL
3)paintGL
該函數才是重頭戲,繪制一般在此函數內進行。在這里,作為示範,我們只是簡單地用之前設置的清除顏色來清除窗口背景。
Qt5怎樣使用OpenGL
最後,我們添加一個 main.cpp 文件,在主函數中新建一個 Window 類對象,然後將其顯示出來。啊哈,縱觀整個過程,相比之前的 Qt 版本,在 Qt5 中使用 OpenGL 是不是超級簡單呢?
Qt5怎樣使用OpenGL

⑸ 如何建立新的QT+opengl工程

我自己學QT時的筆記,供參考

QT下構建OPENGL開發環境

首先在工程文件下加入環境配置 .pro
QT += qt3support //支持qt3支持
QT += opengl //OPENGL庫支持

nehewidget.h文件

#include <qgl.h> //要加入的庫
#include <QtGui/qevent.h> //要加入的庫

class NeHeWidget : public QGLWidget //任何OPENGL的窗體都要從QGLWidget類中派生

{
Q_OBJECT //宏定義只有加入了Q_OBJECT,你才能使用QT中的signal和slot機制

public:
NeHeWidget( QWidget* parent = 0, const char* name = 0, bool fs = false );
~NeHeWidget();
protected:
void initializeGL(); //初始化窗口
void paintGL(); //畫窗口
void resizeGL( int width, int height ); //重置窗口
void keyPressEvent( QKeyEvent *e ); //按鈕事件
protected:
bool fullscreen; //全屏事件
};

源文件
NeHeWidget::NeHeWidget( QWidget* parent, const char* name, bool fs )
: QGLWidget( parent, name ) //二個QGLWidget 需要的構造參數
{
fullscreen = fs;
setGeometry( 0, 0, 640, 480 ); //設置大小
setCaption( "NeHe's OpenGL Framework" );
if ( fullscreen )
showFullScreen(); //設置全局
}
NeHeWidget::~NeHeWidget()
{
}
void NeHeWidget::initializeGL()
{
glShadeModel( GL_SMOOTH );
glClearColor( 0.0, 0.0, 0.0, 0.0 );
glClearDepth( 1.0 );
glEnable( GL_DEPTH_TEST );
glDepthFunc( GL_LEQUAL );
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
}
void NeHeWidget::paintGL()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glLoadIdentity();
}
void NeHeWidget::resizeGL( int width, int height )
{
if ( height == 0 )
{
height = 1;
}
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();
}
void NeHeWidget::keyPressEvent( QKeyEvent *e )
{
switch ( e->key() )
{
case Qt::Key_F2:
fullscreen = !fullscreen;
if ( fullscreen )
{
showFullScreen();
}
else
{
showNormal();
setGeometry( 0, 0, 640, 480 );
}
updateGL();
break;
case Qt::Key_Escape:
close();
}
}

main.cpp
#include <qapplication.h>
#include <qmessagebox.h>
#include "nehewidget.h"
int main( int argc, char **argv )
{
bool fs = false;
QApplication a(argc,argv);
switch( QMessageBox::information( 0,
"Start FullScreen?",
"Would You Like To Run In Fullscreen Mode?",
QMessageBox::Yes,
QMessageBox::No | QMessageBox::Default ) )
{
case QMessageBox::Yes:
fs = true;
break;
case QMessageBox::No:
fs = false;
break;
}
NeHeWidget w( 0, 0, fs );
a.setMainWidget( &w );
w.show();
return a.exec();
}

//QT中用OPENGL畫圖時,記得用UPDATE(),更新數據

⑹ qt android 怎樣使用opengl

qt 可以通過QGLWidget運行opengl。QGLWidget繼承QWidget,能夠直接在裡面調用opengl的介面。這個在qt文檔里有具體說明,也有相關例子,所以不贅述了。但是無法在正式軟體裡面執行,為什麼?因為正式軟體是用QGraphicsScene這個場景類操作和操作一切item,而用QGraphicsView將其顯示出來,而每一個item都是QGraphicsItem的子類。QGLWidget並不是QGraphicsItem類,我曾經嘗試用普通的QWidget類那樣,通過proxy來加進QGraphicsItem,但是沒有成功。或許有方法,但是沒有找到。
於是我放棄了用QGLWidget來操作opengl的打算,尋找直接在QGraphicsItem中操作opengl的方法。通過查看文檔和示例代碼,找到了這個方法:
1 往qt工程文件里添加opengl以及對應的lib。
2 對QGraphicsView進行一個三維對話框的指定,代碼如下:
QGLWidget *widget = new QGLWidget(QGLFormat(QGL::SampleBuffers));
widget->makeCurrent();
QGraphicsView view;
view.setViewport(widget);
上述代碼告訴了 QGraphicsView 類當前繪制的對象是支持opengl的。於是所有的場景中的item都將繪制到widget 上。
3 寫一個QGraphicsItem的繼承類,特別要重寫paint函數。代碼如下:
void XXX::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
painter->beginNativePainting();
glColor3f(0.5,1.0,0.2);
glBegin(GL_TRIANGLES);
glVertex3f(100.0,100.0,-100.0);
glVertex3f(150.0, 100.0, -100.0);
glVertex3f(100.0, 150.0, -100.0);
glEnd();
painter->endNativePainting();
}
上面這個函數主要是用opengl介面繪制了一個三角形。記住,在opengl繪制之前一定要執行painter->beginNativePainting()以及painter->endNativePainting()這兩個語句。
QGraphicsScene、 QGraphicsView和QGraphicsItem的關系可以查閱相關文檔,也不贅述了。
不過我按照這個方式畫的三角形,怎麼也在窗口上顯示不出來,找了半天才發現問題在這個函數上QGraphicsItem::boundingRect()。這個函數是 干什麼用的呢?主要用來返回該item的初始化大小,這個大小不會輕易改變,後續的改變都可以通過矩陣來完成,但是初始大小是不變的。QGraphicsView通過這個矩形來判斷當前item是不是需要重繪,如果在重繪區外,則不調用重繪函數了。同時碰撞檢測之類,也可以用這個矩形來判斷。原來,item本身的矩陣外包框不對,所以才導致了重回不出來,改過來就正確了。
上面說的很潦草,具體怎麼改的步驟就不說了。要想正確的繪制,必須得弄清楚坐標系的關系,QGraphicsScene、QGraphicsView以及QGraphicsItem這三個坐標繫到底是什麼關系。我看了文檔,也自己進行了測試,但是感覺文檔和測試的結果有些出入。具體出入不說了。說一下自己得心的吧。
先說明:涉及到一切大小和長度,都是像素大小,至少我測試的結果是這樣的。
在建立QGraphicsScene對象的時候,有一個構造函數是矩形,這個矩形是什麼含義呢?經過測試,發現這個矩形並沒有指定彈出窗口的位置,比如,我把矩形的左上角點指定為-1000,-1000,顯示的位置和1000,1000是一樣的,而長度則正確指定了(當然,可能會有滾動條)。所以,這個矩形的左上角點並不是顯示的窗口的位置,而是它在邏輯上的左上角點。我們顯示一切item,都是以這個邏輯上的坐標系為准來繪制的。比如,左上角點是-1000,-1000,而item的位置在-500,-500,則這個-500,-500相當於在顯示窗口的左上角往下各加500個像素的坐標的位置。
那麼 QGraphicsItem的boundingRect是什麼意思呢?返回的是什麼大小?是以什麼坐標系顯示的大小?首先,這個大小肯定是以像素為單位的,其次,這個矩形的坐標是以QGraphicsScene的邏輯坐標為準的。當然這個大小是沒有任何矩陣疊加的大小。有了矩陣疊加後,實際的矩形可能會發生變化。假如在boundingRect中指定矩形的左上角為100,100,那麼最終體現的位置則是QGraphicsScene邏輯坐標100,100的位置,如果QGraphicsScene的左上角點已經指定為-1000,-1000,那麼這個位置實際上就是離窗口左上角點1100,1100的位置(由於有滾動條,所以也不一定是這個長度。)
那麼在QGraphicsItem的paint函數中進行了opengl繪制用的是什麼坐標呢?其實用的也是QGraphicsScene的邏輯坐標。如上面的例子,繪制的直角三角形直角頂點是0,0,那麼顯示的位置就是距離顯示窗口左上角點1000,1000的位置。不過opengl的所有繪制都是沒有矩陣疊加的基礎上,如果用矩陣疊加,則顯示的位置肯定和指定的有區別了。比如,我用setPos強制指定一個位置,這個位置將和opengl繪圖坐標相疊加,最後顯示到窗口上。我推測setPos其實是改變了矩陣,是一個平移矩陣。

⑺ 如何在Qt中配置OpenGL

在Qt中配置OpenGL的方法
我沒有用過glaux.dll 但是用過glut相關庫 你在設置好庫後,在項目文件里添加-lglut就行了。
就是在*.pro里添加LIBS =-lopengl32 -lglut32 -lglut -lglu32 如果提示差什麼再加。
不知道能不能幫你,聽說現在基本不用glaux了,所以我沒有用過,特別是在linux下好象沒有。我也用linux,所以需要通用。
再說一下,我用的qt版本是2010.05(4.7)你也許是用的最新版本,我不知道一樣不一樣。 我電腦太差,最新版本很多東西要自己一樣一樣下載,而且安裝比較麻煩

⑻ qtopencv和qtopengl的區別

QTOpenGL是第三方庫,使用起來再也不用繁瑣的用數組轉換類型。
其他還有QTPYTHON,OPENCVVS+QT+OpenGL。QtopenCV庫,QtOpenCV和QtOpenGL類似。
主要是為了方便在Qt中使用OpenCV。可以很容易的把OpenCV「融入」Qt內。

⑼ qt + opengl 開發環境的搭建

Qt各種版本的下載地址:http://qt-project.org/downloads
建議你下載Qt5對應的版本,對應VS2010開發比較好!
(1)Qt 5.1.0 for Windows 32-bit (VS 2010, 505 MB) (Info)
(2)Visual Studio Add-in 1.2.2 for Qt5
(3)VS2010
前兩個(1)、(2)在上面的網址都可以找到,下載即可
VS2010安裝後,安裝下載好的那兩個Qt插件,安裝成功後VS中會出現Qt5,配置環境後即可開發Qt界面程序

閱讀全文

與qtopengl編程相關的資料

熱點內容
機明自動編程軟體源碼 瀏覽:325
php埠號設置 瀏覽:540
phperegreplace 瀏覽:319
androidgridview翻頁 瀏覽:537
ssh協議編程 瀏覽:634
如何開我的世界電腦伺服器地址 瀏覽:861
玄關pdf 瀏覽:609
程序員學習論壇 瀏覽:940
程序員的毒雞湯怎麼做 瀏覽:547
安卓怎麼降級軟體到手機 瀏覽:281
雲與伺服器入門書籍推薦產品 瀏覽:636
delphi編程助手 瀏覽:761
電腦遇到伺服器問題怎麼辦 瀏覽:515
加工中心編程結束方法 瀏覽:295
了解什麼是web伺服器 瀏覽:139
面向對象的編程的基本特徵 瀏覽:718
php定時執行任務linux 瀏覽:787
php數組中刪除元素 瀏覽:724
螢石雲伺服器視頻 瀏覽:269
防火牆配置伺服器熱備的虛擬地址 瀏覽:189