Hi everyone,
I'm trying to modify the osgViewerQt example by adding a new class of my
own that will contain the viewer. The design is:

   - *wrapper.h*: Defines class *Wrapper*. It inherits from
*QMainWindow*and has a
   *QDockWidget* where the *ViewerWidget* will be attached.
   - *viewer.h: *Defines *ViewerWidget* class. It's the class from the
   example, with a few mods by me.
   - *prueba_osg.cpp: *
   Main function and where a QApplication is created. A Wrapper object is
   created here.

The project compiles, but when I execute it, I get an error:

*QWidget: Must construct a QApplication before a QPaintDevice*

If I remove the *Q_OBJECT* line, the signal and the slot from
*wrapper.h*and compile the files from the terminal using

*g++ -IE:/osg-3.0.1/install/include -LE:/osg-3.0.1/install/bin
-IC:/Qt64/4.8/include -LC:/Qt64/4.8/bin -losgViewer -lOpenThreads -losgDB
-losg -losgGA -losgQt -lQtCore4 -lQtGui4 prueba_qt.cpp*

I can execute the app.

Can you please tell me what can I do to make this work? I've struggling all
morning but couldn't find the solution.

Thanks for your time!
...
PS: Attached to this post are the files I used in this project, including
the pro file from qmake.
#include <QtGui/QApplication>

#include <iostream>

#include "wrapper.h"

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

//    osgViewer::ViewerBase::ThreadingModel threadingModel = osgViewer::ViewerBase::CullDrawThreadPerContext;
/*i 
    osgViewer::ViewerBase::ThreadingModel threadingModel = osgViewer::ViewerBase::ThreadPerCamera;
    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();
//    QDockWidget* dock = new QDockWidget;
//    dock->setWidget(viewWidget);
//    dock->show();
    Wrapper wrap;
    wrap.resize(800,600);
    wrap.setWindowTitle("Cow");
    wrap.showNormal();
    wrap.Do();    
//    for(unsigned int i(0);i<1000000;++i) {
//      std::cout << i << " ";
//    }
//    std::cout << std::endl;
//    wrap.Add();
    return app.exec();
}
#ifndef Viewer_hpp
#define Viewer_hpp

#include <QtGui/QGridLayout>
#include <QtGui/QWidget>
#include <QtCore/QTimer>
#include <osgViewer/CompositeViewer>
#include <osgViewer/ViewerEventHandlers>

#include <osgGA/TrackballManipulator>

#include <osgDB/ReadFile>

#include <osgQt/GraphicsWindowQt>

class ViewerWidget : public QWidget, public osgViewer::CompositeViewer
{
public:
    ViewerWidget(osgViewer::ViewerBase::ThreadingModel threadingModel= osgViewer::ViewerBase::ThreadPerCamera ) : QWidget()
    {
        setThreadingModel(threadingModel);
    }
    
    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=true )
    {
        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();
    }
    void Do(void) {
      QWidget* widget1 = addViewWidget( createCamera(0,0,100,100), osgDB::readNodeFile("cow.osgt") );
//      osg::ref_ptr<osg::Node> node = new osg::Geode;
//      QWidget* widget1 = addViewWidget( createCamera(0,0,100,100), node );
      QGridLayout* grid = new QGridLayout;
      grid->addWidget( widget1, 0, 0 );
      setLayout( grid );
      connect( &_timer, SIGNAL(timeout()), this, SLOT(update()) );
      _timer.start( 10 );
    }
    void Add(void) {
    }
    virtual void paintEvent( QPaintEvent* event )
    { frame(); }

protected:
    QTimer _timer;
};

#endif
#include "wrapper.h"

Wrapper::Wrapper(void) {
    view = new ViewerWidget();
//    view->setGeometry( 100, 100, 800, 600 );
    dock = new QDockWidget;
    dock->setWidget( view );
    dock->setGeometry( 100, 100, 800, 600 );
    dock->setAllowedAreas(Qt::RightDockWidgetArea);
    addDockWidget(Qt::RightDockWidgetArea, dock);
    dock->show();
}
#ifndef Wrapper_hpp
#define Wrapper_hpp

#include "viewer.h"

#include <QtGui/QMainWindow>
#include <QtGui/QDockWidget>

class Wrapper: public QMainWindow {
private:
  ViewerWidget* view;
  QDockWidget* dock;
public:
  Wrapper(void) {
        view = new ViewerWidget();
//    view->setGeometry( 100, 100, 800, 600 );
    dock = new QDockWidget;
    dock->setWidget( view );
    dock->setGeometry( 100, 100, 800, 600 );
    dock->setAllowedAreas(Qt::RightDockWidgetArea);
    addDockWidget(Qt::RightDockWidgetArea, dock);
    dock->show();
  }
  void Do(void) { view->Do(); }
  void Add(void) { view->Add(); }
  virtual ~Wrapper(void) {
//    delete view;
//    delete dock;
  }
};

#endif

Attachment: prueba_osg.pro
Description: Binary data

_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to