Qt主窗口中的OpenSceneGraph集成

Qt主窗口中的OpenSceneGraph集成,qt,opengl-es,openscenegraph,qtwidgets,qtopengl,Qt,Opengl Es,Openscenegraph,Qtwidgets,Qtopengl,我有以下代码,它是OpenSceneGraph()给出的用于将OSG与Qt集成的代码的修改: OSGViewer.h #ifndef OSGVIEWER_H #define OSGVIEWER_H #include <QTimer> #include <QApplication> #include <QGridLayout> #include <osgViewer/CompositeViewer> #include <osgViewer/

我有以下代码,它是OpenSceneGraph()给出的用于将OSG与Qt集成的代码的修改:

OSGViewer.h

#ifndef OSGVIEWER_H
#define OSGVIEWER_H

#include <QTimer>
#include <QApplication>
#include <QGridLayout>

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

#include <osgGA/MultiTouchTrackballManipulator>

#include <osgDB/ReadFile>

#include <osgQt/GraphicsWindowQt>

#include <QGLWidget>

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

    QWidget* addViewWidget( osgQt::GraphicsWindowQt* gw, osg::Node* scene );

    osgQt::GraphicsWindowQt* createGraphicsWindow( int x, int y, int w, int h, const std::string& name="", bool windowDecoration=false );

    virtual void paintEvent( QPaintEvent* event ) { frame(); }

    QTimer _timer;
};

#endif // OSGVIEWER_H
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "OSGViewer.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    //void onCreateView();

private:
    Ui::MainWindow *ui; 
    osg::ref_ptr<ViewerWidget> m_osgViewer_right, m_osgViewer_left;
};

#endif // MAINWINDOW_H
虽然我可以在我的主窗口中使用两个不同的QWidget渲染两个对象,但我总是在主窗口后面弹出另外两个单独的空窗口。如果关闭它们,则无法在主窗口中再渲染模型。有什么办法解决这个问题吗?我是OpenSceneGraph的新手

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "OSGViewer.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    //void onCreateView();

private:
    Ui::MainWindow *ui; 
    osg::ref_ptr<ViewerWidget> m_osgViewer_right, m_osgViewer_left;
};

#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    m_osgViewer_left = new ViewerWidget(this);
    ui->left = m_osgViewer_left->addViewWidget(m_osgViewer_left->createGraphicsWindow(0,0,100,100), osgDB::readNodeFile("cessnafire.osg") );        
    m_osgViewer_left->show();

    m_osgViewer_right = new ViewerWidget;
    ui->right = m_osgViewer_right->addViewWidget(m_osgViewer_right->createGraphicsWindow(0,0,100,100), osgDB::readNodeFile("cow.osgt") );       
    m_osgViewer_right->show();

    ui->gridLayout->addWidget( ui->left, 0, 0 );
    ui->gridLayout->addWidget( ui->right, 0, 2 );   
}
/* ------------------------------------------------------- */
MainWindow::~MainWindow()
{
    delete ui;
}