I just played around a bit and managed to get a very simple integration.
It is a bit cheating, I simply take an OSG window and add it to a Qt widget.
* No fancy Qt stuff supported like drag and drop, overdrawing etc.
* Only windows (although Linux should be no problem after some modifying)
* Multithreading not a problem here
* Should run with Qt 5.1 or newer


Code:


#include <osgDB/ReadFile>
#include <osgGA/TrackballManipulator>
#include <osgViewer/Viewer>
#include <osgViewer/api/win32/GraphicsWindowWin32>

#include <QApplication>
#include <QHBoxLayout>
#include <QSlider>
#include <QTimer>
#include <QWidget>
#include <QWindow>
#include <assert.h>

int main(int argc, char** argv)
{
    if (argc<2)
    {
        std::cout << argv[0] <<": requires filename argument." << std::endl;
        return 1;
    }   

    // Create Qt app
    QApplication app( argc, argv );
  
    // Create OSG Window
    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
    
    // setup viewer
    {
        viewer->setUpViewInWindow(0,0,800,600);
        viewer->setCameraManipulator(new osgGA::TrackballManipulator);
        viewer->setSceneData(osgDB::readNodeFile(argv[1]));
        viewer->realize(); // else window does not show
    }


    QWidget* mainwidget = new QWidget;    
    mainwidget->setLayout(new QVBoxLayout());
    mainwidget->resize(800,600);    
    mainwidget->show();

    // Add osg window to main widget
    {
        osgViewer::ViewerBase::Windows wins;
        viewer->getWindows(wins);

        // Get native windows HWND window id from OSG window
        osgViewer::GraphicsWindowWin32* osgwin = 
dynamic_cast<osgViewer::GraphicsWindowWin32*>(wins.front());
        assert(osgwin);
        HWND winid = osgwin->getHWND();        
    
        // Create a QWindow from osg window id and place it in a widget
        QWindow* qtwindow = QWindow::fromWinId((WId)winid);    
        QWidget* osgwidget = QWidget::createWindowContainer(qtwindow); 
        osgwidget->setMinimumSize(QSize(320,200));    
    
        // Add osg widget to a main widget    
        mainwidget->layout()->addWidget(osgwidget);  
    }

    // Add a slider changing the background color
    {
        QSlider* slider = new QSlider(Qt::Horizontal, mainwidget);
        slider->setRange(0, 255);
        mainwidget->layout()->addWidget(slider);

        // Connect to lambda
        QObject::connect(slider, &QSlider::valueChanged, [=](int v) { 
viewer->getCamera()->setClearColor(osg::Vec4((float)v / 256.0f, 0, 1, 1)); });
    }


    // Make Qt call osg tick
    {
        QTimer* timer = new QTimer(mainwidget);
        timer->start(20);
        QObject::connect(timer, &QTimer::timeout, [=]() { viewer->frame(); });
    }

    
    app.exec();

    // clean up
    viewer = nullptr;
    delete mainwidget;
    return 0;
}





------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=58690#58690





_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to