Qt加载OSg视图例子

//QT += core gui opengl
//LIBS +=  -losgViewer  -losgDB -losgUtil  -losg  -lOpenThreads -losgGA -losgQt
#include <QtGui/QApplication>
#include <osg/ArgumentParser>
#include <osgViewer/Viewer>
#include <osgViewer/CompositeViewer>
#include <osgViewer/ViewerEventHandlers>
#include <osgGA/TrackballManipulator>
#include <osgDB/ReadFile>
#include <QtCore/QString>
#include <QtCore/QTimer>
#include <QtGui/QKeyEvent>
#include <QtGui/QApplication>
#include <QtOpenGL/QGLWidget>
#include <QtGui/QMainWindow>
#include <QtGui/QMdiSubWindow>
#include <QtGui/QMdiArea>
#include <iostream>

using Qt::WindowFlags;

class AdapterWidget:public QGLWidget
{
public:
    AdapterWidget(QWidget *parent=0,const char* name=0,const QGLWidget * shareWidget=0,WindowFlags f=0);

    virtual ~AdapterWidget()
    {

    }

    osgViewer::GraphicsWindow* getGraphicsWindow()
    {
        return _gw.get();
    }

    const osgViewer::GraphicsWindow* getGraphicsWidow()const
    {
        return _gw.get();
    }
protected:
    void init();
    virtual void resizeGL(int width,int height);
    virtual void keyPressEvent(QKeyEvent* event);
    virtual void keyReleaseEvent(QKeyEvent* event);
    virtual void mousePressEvent(QMouseEvent* event);
    virtual void mouseReleaseEvent(QMouseEvent* event);//
    virtual void mouseMoveEvent(QMouseEvent* event);

    osg::ref_ptr<osgViewer::GraphicsWindowEmbedded> _gw;

};

AdapterWidget::AdapterWidget(QWidget *parent,const char* name,const QGLWidget * shareWidget,WindowFlags f):QGLWidget(parent,shareWidget,f)
{
    _gw=new osgViewer::GraphicsWindowEmbedded(0,0,width(),height());
    setFocusPolicy(Qt::ClickFocus);

}

void AdapterWidget::resizeGL(int width, int height)
{
    _gw->getEventQueue()->windowResize(0,0,width,height);
    _gw->resized(0,0,width,height);

}
void AdapterWidget::keyPressEvent(QKeyEvent* event)
{
    _gw->getEventQueue()->keyPress( (osgGA::GUIEventAdapter::KeySymbol) *(event->text().toAscii().data() ) );

}

void AdapterWidget::keyReleaseEvent(QKeyEvent* event)
{
    _gw->getEventQueue()->keyRelease(  (osgGA::GUIEventAdapter::KeySymbol)*(event->text().toAscii().data()));

}

void AdapterWidget::mousePressEvent(QMouseEvent* event)
{
    int button=0;
    switch (event->button())
    {
    case(Qt::LeftButton):
        button=1;
        break;
    case (Qt::MidButton):
        button=2;
        break;
    case (Qt::RightButton):
        button=3;
        break;
    case (Qt::NoButton):
        button=0;
        break;
    default:
        button=0;
        break;

    }

    _gw->getEventQueue()->mouseButtonPress(event->x(),event->y(),button);

}

void AdapterWidget::mouseReleaseEvent( QMouseEvent* event )
{
    int button = 0;
    switch(event->button())
    {
    case(Qt::LeftButton):
        button = 1;
        break;
    case(Qt::MidButton):
        button = 2;
        break;
    case(Qt::RightButton):
        button = 3;
        break;
    case(Qt::NoButton):
        button = 0;
        break;
    default:
        button = 0;
        break;
    }
    _gw->getEventQueue()->mouseButtonRelease(event->x(), event->y(), button);
}

void  AdapterWidget::mouseMoveEvent(QMouseEvent* event)
{
    _gw->getEventQueue()->mouseMotion(event->x(),event->y());

}

class ViewerQT : public osgViewer::Viewer, public AdapterWidget
{
public:
    ViewerQT(QWidget * parent=0,const char * name=0,const QGLWidget * shareWidget=0,WindowFlags f=0):AdapterWidget(parent ,name,shareWidget ,f)
    {
        getCamera()->setViewport(new osg::Viewport(0,0,width(),height()));
        getCamera()->setProjectionMatrixAsPerspective(30.0f, static_cast<double>(width())/static_cast<double>(height()), 1.0f, 10000.0f);
        getCamera()->setGraphicsContext(getGraphicsWindow());

        setThreadingModel(osgViewer::Viewer::SingleThreaded);
        connect(&_timer,SIGNAL(timeout()),this,SLOT(updateGL()));//并且把它的timeout()连接到适当的槽。当这段时间过去了,它将会发射timeout()信号。

        _timer.start(10);//使用start()来开始

    }

    virtual void paintGL()
    {
        frame();
    }
protected:
    QTimer _timer;
};

int main(int argc,char** argv)
{
    QApplication a(argc,argv);
    osg::ref_ptr<osg::Node>  loadedModel=osgDB::readNodeFile("cow.osg");
    ViewerQT * ViewerWindow=new ViewerQT;
    ViewerWindow->setCameraManipulator(new osgGA::TrackballManipulator);
    ViewerWindow->setSceneData(loadedModel.get());

    QMainWindow* mw=new QMainWindow();
    mw->showMaximized();
    mw->setCentralWidget(ViewerWindow);
    mw->show();
    a.connect(&a,SIGNAL(lastWindowClosed()),&a,SLOT(quit()));
    return a.exec();
}
时间: 2024-10-11 00:42:09

Qt加载OSg视图例子的相关文章

qt 加载翻译文件 qm

QTranslator* myTranslator=new QTranslator;myTranslator->load("xxx.qm");app.installTranslator(myTranslator);QTranslator* chTranslator=new QTranslator;chTranslator->load("qt_zh_CN.qm");app.installTranslator(chTranslator);qt 加载翻译文件

jQuery加载部分视图(Partial Views)

本篇是演示使用jQuery加载部分视图(Partial View).如果你不想使用Razor的语法呈现部分视图,那此篇的方法是最理想的了.它可以Render至指定的tag上. 创建两个部分视图,一个为_News.cshtml,内呈现的数据是一些静态数据,当然可以传入model,使用Razor来呈现. 另一个为_Article.cshtml: 添加控制器,第一个Action是为视图准备,而News()与Article() Action是返回PartialViewResult(),它们就是稍后我们视

MVC通过JsonResult返回Json数据,然后在视图页面中通过@Html.Partial()方法加载分部视图

首先,新建一个MVC类型的Web项目: 然后在Model文件夹下定义一个Student实体: public class Student { public int ID { get; set; } public string Name { get; set; } public string Sex { get; set; } public int Age { get; set; } } 然后新建一个Student控制器: using JsonDataWithMVC.Models; using Sy

在ASP.NET MVC中加载部分视图的方法及差别

在视图里有多种方法可以加载部分视图,包括Partial() .Action().RenderPartial().RenderAction().RenderPage()方法.下面说明一下这些方法的差别. 1. Partial与RenderPartial方法 Partial可以直接输出内容,在内部将html内容转化为String字符(MVCHtmlString),然后缓存起来,最后一次性输出到页面.效率比较低 通常使用RenderPartial代替 2. RenderPartial与RenderAc

qt加载dll

qt加载dll时 dll与qt项目编译器必须是同一个.同时qt用QLibrary方式是动态加载.就是如果你没有用到dll里面的东西它不会直接加载. const char* temp = "D:\\Users\\pautoenr.dll"; //HINSTANCE hDLL = LoadLibrary(L"D:\\Users\\myrootkit.dll"); QLibrary myLib("D:\\Users\\myrootkit.dll");

基于layer封装的异步加载分部视图弹出层

背景:之前一直用的artdialog,但是样式不是很好看,后来偶然看到layer,觉得不错,但是对于.net mvc来说,不能像artdialog一样弹出分部视图是很难受的.所以下面的方法就解决了. <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta na

iOS 从xib中加载自定义视图

想当初在学校主攻的是.NET,来到公司后,立马变成java开发,之后又跳到iOS开发,IT人这样真的好么~~  天有不测风云,云还有变幻莫测哎,废话Over,let's go~ 新学iOS开发不久,一直在想一个问题,IB可以图形化设计界面,为毛不直接拿设计好的界面直接复用呢? 百度了很多,发现大部分都是依赖Controller实现,要去设置File Owner,妹的,哥哥只是想复用一个简单的view好么,要你妹的控制器啊,于是接着搜,结果没有神马大的结果,主要是自己懒着动手去实践,今天决定自己去

Qt加载网页(加载浏览器插件)和制作托盘后台运行(南信大财务报账看号)

程序模块要添加QNetWork和QWebKit模块: nuistfinancevideo.h文件: #ifndef NUISTFINANCEVIDEO_H #define NUISTFINANCEVIDEO_H #include <QtGui/QtGui> #include <QtNetwork/QNetworkReply> #include <QtWebKit/QWebView> #include <QtWebKit/QWebElementCollection&

滚动加载服务器端内容——例子

网页代码如下 <!doctype html> <html> <head> <meta charset="utf-8"> <title>滚动加载</title> <style> * {margin:0; padding:0; border:0;} #container {width:960px; margin:auto;} #container:after {display:block; height:0