osg底層使用的是opengl圖形系統,qt也增加了對opengl的支援,因此,可以通過qt的opengl模組,實現將osg視窗嵌入到qt中,這樣可以充分利用qt的ui介面設計,滿足osg的2d的介面系統的不足。當然除了使用osg做2d渲染特效,可以盡情享受qt介面設計帶來的方便。
qt中,場景檢視模型模組,可以使用opengl繪製基本圖元。檢視,即:qgraphicsview ,場景,即:qgraphicsscene,當然還有基本圖元項,qgraphicsitem,這裡暫不介紹。
簡單設計思路:我們新建乙個qt mainwindow專案。首先,將場景,加入到檢視中,接著,將檢視加入mainwindow中,這樣以後,我們就可以使用mainwindow在檢視中瀏覽場景,場景包含osg內容,這樣,我們就達到了目的。
osg的視窗api中,可以嵌入各種各樣的視窗系統,這給我移植到qt帶來的可能,在osg參考文件中,我選擇使用graphicswindowembedded 來建立可移植的視窗。
檔案:glview.h
#pragma once
#include #include #include #include "glscene.h"
class glview :
public qgraphicsview
;
檔案:glview.cpp
#include "glview.h"
#include glview::glview(qwidget *parent):
qgraphicsview(parent)
,m_widget(new qglwidget(qglformat(qgl::doublebuffer)))
,m_scene(new glscene(this))
glview::~glview(void)
//更新檢視的時候,更新場景
void glview::resizeevent( qresizeevent *event )
檔案:glscene.h
#pragma once
#include #include #include #include #include #include "osglib.h"
#include #include #include #include #include "keyboardmap.h"
static keyboardmap s_qtkeyboardmap;//按鍵對映
class glscene :
public qgraphicsscene
;
檔案:glscene.cpp
#include "glscene.h"
glscene::glscene(qobject *parent):
qgraphicsscene(parent)
,m_viewer(null)
,timer_id(0)
glscene::~glscene(void)
//繪製場景
void glscene::drawbackground( qpainter *painter, const qrectf &rect )
//視窗更新函式
void glscene::timerevent(qtimerevent *)
void glscene::mousepressevent( qgraphicsscenemouseevent * mouseevent )
//_gw->geteventqueue()->mousebuttonrelease( event->x(), event->y(), button );
(dynamic_cast(m_viewer->getcamera()->getgraphicscontext()))->geteventqueue()->mousebuttonpress( mouseevent->scenepos().x(), mouseevent->scenepos().y(), button );
}void glscene::mousereleaseevent( qgraphicsscenemouseevent * mouseevent )
(dynamic_cast(m_viewer->getcamera()->getgraphicscontext()))->geteventqueue()->mousebuttonrelease( mouseevent->scenepos().x(), mouseevent->scenepos().y(), button ); }
void glscene::mousemoveevent( qgraphicsscenemouseevent * mouseevent )
void glscene::mousedoubleclickevent( qgraphicsscenemouseevent * mouseevent )
(dynamic_cast(m_viewer->getcamera()->getgraphicscontext()))->geteventqueue()->mousedoublebuttonpress( mouseevent->scenepos().x(), mouseevent->scenepos().y(), button );
}void glscene::wheelevent( qgraphicsscenewheelevent * wheelevent )
void glscene::keypressevent( qkeyevent * keyevent )
void glscene::keyreleaseevent( qkeyevent * keyevent )
//osg場景視窗更新
void glscene::resizeviewer()
//組合鍵
void glscene::setkeyboardmodifiers( qinputevent* event )
檔案:qtosgmainwindow.h
#ifndef qtosgmainwindow_h
#define qtosgmainwindow_h
#include #include "ui_qtosgmainwindow.h"
#include "glview.h"
class qtosgmainwindow : public qmainwindow
;#endif // qtosgmainwindow_h
檔案:qtosgmainwindow.cpp#include "qtosgmainwindow.h"
qtosgmainwindow::qtosgmainwindow(qwidget *parent)
: qmainwindow(parent)
qtosgmainwindow::~qtosgmainwindow()
void qtosgmainwindow::resizeevent( qresizeevent * )
注:檔案使用keyboardmap.h等檔案,注釋掉即可,該檔案用於qt按鍵與osg按鍵的對映.
#include "qtosgmainwindow.h"
到此,可實現qt視窗的,osg顯示. 將ogre 嵌入到 Qt中
我用的環境是vs2008 qt 2,新增幾個檔案如下 fogrewidget.h include 如果為假就返回 ifndef false return define false return h,r if h return r endif ifndef degug define degug end...
Qt 中實現陰影視窗
陰影視窗的實現方法一般有三種,方法一是 在視窗的建構函式中設定視窗的屬性為 setattribute qt wa translucentbackground 從而保證視窗不被繪製的部分透明化。接著重寫繪製函式paintevent 其 示例如下 void qt test paintevent qpai...
QT中不規則視窗的實現
描述 mask.png 視窗掩碼圖 描述 toolbutton.png 按鈕背景圖 描述 toolbutton mask.png 按鈕掩碼圖 描述 runtime.png 示例執行時圖 qt 中不規則窗體和部件的實現,不管是窗體還是部件,都是從qwidget派生而來的,所以它們的原理是一樣的,都是設...