You might need to change how and when the osg viewer frame() is called. You 
migh also need to apply new osgQt patch waiting at submissions. I'am pasting 
modified osg Qt viewer example with more general frame update solution:

#include <QtCore/QTimer>
#include <QtGui/QApplication>
#include <QtGui/QGridLayout>

#include <osgViewer/CompositeViewer>
#include <osgViewer/ViewerEventHandlers>

#include <osgGA/TrackballManipulator>

#include <osgDB/ReadFile>

#include <osgQt/GraphicsWindowQt>

#include <iostream>

class ViewerWidget : public QWidget, public osgViewer::CompositeViewer
{
public:
    ViewerWidget(osgViewer::ViewerBase::ThreadingModel 
threadingModel=osgViewer::CompositeViewer::SingleThreaded) : QWidget()
    {
        setThreadingModel(threadingModel);

        QWidget* widget1 = addViewWidget( createCamera(0,0,100,100), 
osgDB::readNodeFile("cow.osgt") );
        QWidget* widget2 = addViewWidget( createCamera(0,0,100,100), 
osgDB::readNodeFile("glider.osgt") );
        QWidget* widget3 = addViewWidget( createCamera(0,0,100,100), 
osgDB::readNodeFile("axes.osgt") );
        QWidget* widget4 = addViewWidget( createCamera(0,0,100,100), 
osgDB::readNodeFile("fountain.osgt") );
        QWidget* popupWidget = addViewWidget( 
createCamera(900,100,320,240,"Popup window",true),
                                            
osgDB::readNodeFile("dumptruck.osgt") );
        popupWidget->show();

        QGridLayout* grid = new QGridLayout;

        grid->addWidget( widget1, 0, 0 );
        grid->addWidget( widget2, 0, 1 );
        grid->addWidget( widget3, 1, 0 );
        grid->addWidget( widget4, 1, 1 );
        setLayout( grid );

        //connect( &_timer, SIGNAL(timeout()), this, SLOT(repaint ()) );
        //_timer.start( 10 );
        setRunFrameScheme(osgViewer::ViewerBase::ON_DEMAND);
        _timerId = startTimer(0);
    }
    virtual ~ViewerWidget()
    {
        if (_timerId != 0)
            killTimer(_timerId);
    }

    QWidget* addViewWidget( osg::Camera* camera, osg::Node* scene )
    {
        osgViewer::View* view = new osgViewer::View;
        view->setCamera( camera );
        addView( view );
        
        view->setSceneData( scene );
        view->addEventHandler( new osgViewer::StatsHandler );
        view->setCameraManipulator( new osgGA::TrackballManipulator );
        
        osgQt::GraphicsWindowQt* gw = dynamic_cast<osgQt::GraphicsWindowQt*>( 
camera->getGraphicsContext() );
        return gw ? gw->getGLWidget() : NULL;
    }
    
    osg::Camera* createCamera( int x, int y, int w, int h, const std::string& 
name="", bool windowDecoration=false )
    {
        osg::DisplaySettings* ds = osg::DisplaySettings::instance().get();
        osg::ref_ptr<osg::GraphicsContext::Traits> traits = new 
osg::GraphicsContext::Traits;
        traits->windowName = name;
        traits->windowDecoration = windowDecoration;
        traits->x = x;
        traits->y = y;
        traits->width = w;
        traits->height = h;
        traits->doubleBuffer = true;
        traits->alpha = ds->getMinimumNumAlphaBits();
        traits->stencil = ds->getMinimumNumStencilBits();
        traits->sampleBuffers = ds->getMultiSamples();
        traits->samples = ds->getNumMultiSamples();
        
        osg::ref_ptr<osg::Camera> camera = new osg::Camera;
        camera->setGraphicsContext( new osgQt::GraphicsWindowQt(traits.get()) );
        
        camera->setClearColor( osg::Vec4(0.2, 0.2, 0.6, 1.0) );
        camera->setViewport( new osg::Viewport(0, 0, traits->width, 
traits->height) );
        camera->setProjectionMatrixAsPerspective(
            30.0f, 
static_cast<double>(traits->width)/static_cast<double>(traits->height), 1.0f, 
10000.0f );
        return camera.release();
    }
    
    virtual bool event( QEvent* event )
    {
        if (event->type() == QEvent::Timer)
        {
            if (static_cast<QTimerEvent*>(event)->timerId() == _timerId)
            {
                frame();
                return true;
            }
        }
        return QWidget::event(event);
    }
    //virtual void paintEvent( QPaintEvent* event )
    //{
        //      frame();
        //}

protected:
    
    int _timerId;
};

int main( int argc, char** argv )
{
    osg::ArgumentParser arguments(&argc, argv);

    osgViewer::ViewerBase::ThreadingModel threadingModel = 
osgViewer::ViewerBase::CullThreadPerCameraDrawThreadPerContext;
    while (arguments.read("--SingleThreaded")) threadingModel = 
osgViewer::ViewerBase::SingleThreaded;
    while (arguments.read("--CullDrawThreadPerContext")) threadingModel = 
osgViewer::ViewerBase::CullDrawThreadPerContext;
    while (arguments.read("--DrawThreadPerContext")) threadingModel = 
osgViewer::ViewerBase::DrawThreadPerContext;
    while (arguments.read("--CullThreadPerCameraDrawThreadPerContext")) 
threadingModel = osgViewer::ViewerBase::CullThreadPerCameraDrawThreadPerContext;
    
    QApplication app(argc, argv);
    ViewerWidget* viewWidget = new ViewerWidget(threadingModel);
    viewWidget->setGeometry( 100, 100, 800, 600 );
    viewWidget->show();
    return app.exec();
}

Robert Milharcic

-----Original Message-----
From: [email protected] 
[mailto:[email protected]] On Behalf Of Joseph Louis
Sent: Tuesday, September 06, 2011 1:10 AM
To: [email protected]
Subject: Re: [osg-users] OSG + QT and QTabWidget: Disappearing scene graph

Hi Angus,

I am trying to do the same with my program but the scene does not even appear 
in any of the tbs. I am also using the osgviewerQT example. Were you able to 
get your's to work?

Thank you!

Cheers,
Joseph

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





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

Reply via email to