將OSG嵌入QT視窗系統中,實現拖拽介面

2021-07-03 04:37:41 字數 3896 閱讀 9924

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派生而來的,所以它們的原理是一樣的,都是設...