Hi,
what i'm doing:-
 i'm creating an OpenSceneGraph based application by integrating
openscenegraph scene with QT GUI windowing system.
 
i'm using QML based UI navigation (QML views sits inside a QWidget which in
turn sits inside Borderlayout(as center widget) of Parent QWidget(main window)).

I'm switching QML UI's with signal slots mechanism, and on particular button
selection on QML view(qml signal to c++ QWidget), i'm removing current QML
view with QGLWidget which is paintaing OpenSceneGraph by calling osgViewer
frame() from paintEvent(QPaintEvent *):-

my problem :- 
    
> getting continues error on console : QOpenGLContext::swapBuffers()
> called with non-exposed window, behavior is undefined



code(not full) :-


> 
> 
>   
>     osg::Camera* createCamera(int x, int y, int w, int h )
>    {
>      osg::DisplaySettings* ds = osg::DisplaySettings::instance().get();
> 
>      osg::ref_ptr<osg::GraphicsContext::Traits> traits = new
> osg::GraphicsContext::Traits;
>      traits->windowDecoration = false;
>      traits->x = x;
>      traits->y = y;
>      traits->width = w;
>      traits->height =  h;
>      traits->doubleBuffer = true;
> 
>      osg::ref_ptr<osg::Camera> camera = new osg::Camera;
>      osgQt::initQtWindowingSystem();
>      QGLFormat format = 
> osgQt::GraphicsWindowQt::traits2qglFormat(traits.get());
> 
>      osgQt::GLWidget* glwidget = new osgQt::GLWidget(format,0, 0, 0, true);
> 
>      camera->setGraphicsContext(new osgQt::GraphicsWindowQt(glwidget));
> 
>      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(40.0f,
> static_cast<double>(traits->width)/static_cast<double>(traits->height),
> 0.1f, 1000.0f );
> 
>      return camera.release();
> 
>    }
>   
> 
> 
> class GuiMainWindow:public QWidget
> {
> 
>      Q_OBJECT
> 
>      public:
> 
>         GuiMainWindow()
>         {  
>            QDesktopWidget desktop;
>            QRect screen= desktop.screenGeometry();
>            WIDTH=screen.width();
>            HIGHT=screen.height();
> 
>            _camera=createCamera(0,0,WIDTH,HIGHT);
>            _osgroot=new osg::Group;
>            _osgroot->addChild(osgDB::readNodeFile("c:/data/tank.flt")); 
>        }
> 
>         virtual void paintEvent(QPaintEvent *)
>        {
>              if(osg_init)
>                _viewer.frame();
>        }
> 
>        void setOsgScene(osg::Group* root,osg::Camera* camera)
>        {     
>              _viewer.setSceneData(root);
>              _viewer.setCamera(camera);
>              _viewer.setCameraManipulator(new osgGA::TrackballManipulator);
> 
>              _viewer.setThreadingModel( osgViewer::Viewer::SingleThreaded);
> 
>              osgQt::GraphicsWindowQt* gw 
> =dynamic_cast<osgQt::GraphicsWindowQt*>(camera->getGraphicsContext());
> 
> 
>              if(gw)
>             {
>                   _layout_center_widget=gw->getGLWidget();
>           
>                   _layout_center_widget=glw;
>          
>                   _layout_center_widget->setFocusPolicy(Qt::TabFocus);
>           
>                   _base_layout_pane->addWidget(_layout_center_widget, 
> BorderLayout::Center);
>                   _base_borderLayout->update();
>            
>             }
>             
>             connect( &_render_timer, SIGNAL(timeout()), this, SLOT(update()));
>            
>             osg_init=true;
> 
>             _render_timer.start(16.66);
> 
>        }
> 
>       void removeQmlView()
>       {    
>            qDebug("removing current Qml view..");
>            if(_qml_view)
>               _qml_view->destroy();
>       }
> 
>       void removeCenterWidget()
>       {
>           if(_layout_center_widget)
>           {
>               qDebug("removing current center_widget..");
>               _base_borderLayout->removeWidget(_layout_center_widget);
> 
>           }
>  
>       }
>         
>       void nextUIFrame(QString str)
>       {
> 
>      
>          if(str.compare("OSG",Qt::CaseInsensitive)==0)
>         {
>            qDebug("OSG Window from QML");
>            
>            removeQmlView();  
>            removeCenterWidget();
> 
>            setOsgScene(this->_osgroot,this->_camera);
> 
>           return;
>         }
> 
>         if(str.compare("SPLASH",Qt::CaseInsensitive)==0)
>         {
> 
>           Loader* loader=Loader::getInstance();
>           OSGutil::osgResourceManager* 
> osgResmng=OSGutil::osgResourceManager::getInstance();
> 
>           removeQmlView(); 
> 
>           _qml_view=new QQuickView();
>           _qml_view->rootContext()->setContextProperty("GuiWindowCpp",this);
> 
>           _qml_view->setSource(QUrl::fromLocalFile("c:/splash.qml");
>           QQuickItem* obj=_qml_view->rootObject();
> 
> 
>          
> connect(loader,SIGNAL(feedProgressInfo(QVariant)),obj,SLOT(printCurrentLabel(QVariant)));
>          
> connect(osgResmng,SIGNAL(feedProgressData(QVariant)),obj,SLOT(printCurrentValue(QVariant)));
> 
>           removeCenterWidget();
> 
>           
> _layout_center_widget=QWidget::createWindowContainer(_qml_view,this);
>           _layout_center_widget->setFocusPolicy(Qt::TabFocus);
>           _layout_center_widget->showFullScreen();
>           _base_borderLayout->addWidget(_layout_center_widget, 
> BorderLayout::Center);
> 
>           _base_borderLayout->update();
> 
>           return;
> 
>        }
> 
> 
>        if(str.compare("SIM_MODE",Qt::CaseInsensitive)==0)
>        {
>            removeQmlView(); 
> 
>           _qml_view=new QQuickView();
>           
>           _qml_view->rootContext()->setContextProperty("GuiWindowCpp",this);
>           _qml_view->setSource(QUrl::fromLocalFile("c:/sim_mode.qml");
> 
>           QQuickItem* obj=_qml_view->rootObject();
>          
> connect(obj,SIGNAL(qmlChangeSignal(QString)),this,SLOT(nextUIFrame(QString)));
>          
> connect(this,SIGNAL(feedData(QVariant)),obj,SLOT(printValue(QVariant)));
> 
>           removeCenterWidget();
>           
> _layout_center_widget=QWidget::createWindowContainer(_qml_view,this);
>           _layout_center_widget->showMaximized();
>           _layout_center_widget->setFocusPolicy(Qt::TabFocus);
> 
>           _base_borderLayout->addWidget(_layout_center_widget, 
> BorderLayout::Center);
>           _base_borderLayout->update();
> 
>           return;
> 
>        }
> 
>        qDebug("such UI frame/page doesn't enabled..");
> 
> 
>     }
> 
>          
> 
>     BorderLayout* _base_borderLayout;   
>     QWidget* _layout_center_widget;
>     QQuickView* _qml_view;
>    
>     osgViewer::Viewer _viewer;
>     osg::ref_ptr<osg::Camera> _camera;
>     osg::ref_ptr<osg::Group> _osgroot;
>     
>     QTimer _render_timer;
>    
>     int WIDTH;
>     int HIGHT;
>     
>     bool osg_init=false;    
> }
> 
> int main(int argc, char *argv[])
> {
>   QApplication a(argc, argv);
> 
>   GuiMainWindow* window=new GuiMainWindow;
>   window->nextUIFrame("SPLASH");
>   window->showFullScreen();
>   return a.exec();
> 
> }





on calling nextUIFrame("SPLASH") => nextUIFrame("SIM_MODE") works fine but
on calling nextUIFrame("SIM_MODE") => nextUIFrame("OSG") removes current
"SIM_MODE" Qmlview and brings a white screen on top and continues :
"QOpenGLContext::swapBuffers() called with non-exposed window, behavior is
undefined" error messages instead of displaying classic blue openscenegraph 
window.


also, but on nextUIFrame("OSG"), if i dont't destroy Qmlview by calling
removeQmlView(), i get expected blue OpenSceneGraph window but now QML view
still existing behind this OpenSceneGraph top view  i.e two different
windows existing simultaneously and i can switch between them from taskbar
clicks.

i googled regarding this problem, but can't find solution.  

Thank you!

Cheers,
Lokesh

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





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

Reply via email to