zoukankan      html  css  js  c++  java
  • 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();
    }
  • 相关阅读:
    Access数据库连接与Repeater数据控件绑定
    类型空间
    C# ico
    Jackson 框架,轻易转换JSON
    转 Android之项目推荐使用的第三方库,有助于快速开发,欢迎各位网友补充
    天气时段规定
    plupload
    MongoDatabase 数据访问助手类
    android开发教程21篇(版主强烈推荐,几乎每一篇都是精华教程
    Android
  • 原文地址:https://www.cnblogs.com/sangzaohaishui/p/4687771.html
Copyright © 2011-2022 走看看