zoukankan      html  css  js  c++  java
  • [原][osg][QT]osg与QT界面结合的简单例子二

    //main.cpp
    
    #include "VREObliqueEditorQTWindow.h"
    #include <QtWidgets/QApplication>
    #include <QTextCodec>
    #include <QFileInfo>
    
    int main(int argc, char *argv[])
    {
        QTextCodec *xcodec = QTextCodec::codecForLocale();
        QString exeDir = xcodec->toUnicode(QByteArray(argv[0]));
        QString BKE_CURRENT_DIR = QFileInfo(exeDir).path();
        QStringList  libpath;
        libpath << BKE_CURRENT_DIR + QString::fromLocal8Bit("/plugins/platforms");
        libpath << BKE_CURRENT_DIR << BKE_CURRENT_DIR + QString::fromLocal8Bit("/plugins/imageformats");
        libpath << BKE_CURRENT_DIR + QString::fromLocal8Bit("/plugins");
        libpath << QApplication::libraryPaths();
        QApplication::setLibraryPaths(libpath);
        ////以上是跑qt的环境变量
    
        QApplication a(argc, argv);
        
        VREObliqueEditor* mw = new VREObliqueEditor();
        mw->init();
        mw->show();
    
        a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()));
        return a.exec();
    }

    主函数仅仅是QT的调用

    #pragma once
    //VREObliqueEditorQTWindow.h
    
    #include <QtWidgets/QMainWindow>
    #include "ui_VREObliqueEditor.h"
    
    class ViewerQT;
    class VREObliqueEditor : public QMainWindow
    {
        Q_OBJECT
    
    public:
        VREObliqueEditor(QWidget *parent = Q_NULLPTR);
        void init();
    private:
        Ui::VREObliqueEditorClass ui;
    
        ViewerQT * m_viewer;    
    
        void OSGInit();
    };

    QT主窗口头文件

    //VREObliqueEditorQTWindow.cpp
    #include "VREObliqueEditorQTWindow.h"
    
    #include "VREOSGWidget.h"
    
    VREObliqueEditor::VREObliqueEditor(QWidget *parent)
        : QMainWindow(parent)
    {
        ui.setupUi(this);
        m_viewer = new ViewerQT;
    }
    
    void VREObliqueEditor::init()
    {
        OSGInit();
        showMaximized();
        setCentralWidget(m_viewer);
    }
    
    
    void VREObliqueEditor::OSGInit()
    {
    
        osg::ref_ptr<osg::Node>  loadedModel = osgDB::readNodeFile("cow.osg");
        m_viewer->setCameraManipulator(new osgGA::TrackballManipulator);
        m_viewer->setSceneData(loadedModel.get());
    
        m_viewer->addEventHandler(new osgViewer::StatsHandler());
        m_viewer->addEventHandler(new osgViewer::WindowSizeHandler());
    
    }

    QT主窗口头文件

    #pragma once
    //VREOSGWidget.h
    
    #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 <QtOpenGL/QGLWidget>
    #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:
        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;
    
    };
    
    
    
    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;
    };

    osg窗口源文件

    #include "VREOSGWidget.h"
    //VREOSGWidget.cpp
    
    
    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().toLatin1().data()));
    }
    
    void AdapterWidget::keyReleaseEvent(QKeyEvent* event)
    {
        int keyAscii = (osgGA::GUIEventAdapter::KeySymbol)*(event->text().toLatin1().data());
        _gw->getEventQueue()->keyRelease(keyAscii);
        //if (keyAscii == 27)
        //    quit();
    }
    
    
    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());
    
    }

    osg窗口源文件

    一个简单osg与QT窗口的结合

    需要开发QT窗口控件,就在"ui_VREObliqueEditor.h"上与“QT主窗口”做文章

    需要开发OSG则正常开发

  • 相关阅读:
    【AS3代码】滚动的小球
    【AS3代码】颜色拾取器
    【AS3代码】添加/删除XML子元素及属性
    【AS3代码】音乐波纹
    【AS3代码】访问/修改XML子元素和属性
    【AS3代码】擦窗户效果(也就是流行的妄撮游戏)
    【AS3代码】动态时钟
    【AS3代码】加载XML数据
    【AS3代码】正则表达式的各种用法和小实例
    【AS3代码】九宫格小游戏
  • 原文地址:https://www.cnblogs.com/lyggqm/p/9373554.html
Copyright © 2011-2022 走看看