[转][osg][QT]osg与QT界面结合的简单例子

//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();
}

转自:https://www.cnblogs.com/sangzaohaishui/p/4687771.html

注意:QGLWidget使用的库是:Qt5OpenGL.lib

猜你喜欢

转载自www.cnblogs.com/lyggqm/p/9370040.html