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
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