本文采用OsgQt将Osg显示到Qt界面,继承osgQOpenGLWidget(使用QOpenGLWidget,非QGLWidget),可按QWidget进行处理,代码如下:
class ViewerWidget : public osgQOpenGLWidget
{
Q_OBJECT
public:
ViewerWidget(QWidget* parent, osg::Node* scene = 0L);
osgViewer::ViewerBase* getViewer() { return m_renderer; }
virtual ~ViewerWidget();
protected:
void initializeGL() override;
void CreateViewer();
};
ViewerWidget::ViewerWidget(QWidget* parent, osg::Node* scene)
:osgQOpenGLWidget(parent)
{
setMouseTracking(true);//鼠标跟踪生效,没有按键按下也会接收鼠标移动事件
setFocusPolicy(Qt::StrongFocus);//接收键盘按键
CreateViewer();//父类放到initializeGL(),导致渲染后创建对象(异步,通过信号才可使用对象)
if (scene)
{
m_renderer->setSceneData(scene);
}
}
ViewerWidget::~ViewerWidget()
{
}
void ViewerWidget::initializeGL()
{
initializeOpenGLFunctions();
setDefaultDisplaySettings();
emit initialized();
}
void ViewerWidget::CreateViewer()
{
m_renderer = new OSGRenderer(this);
QScreen* screen = windowHandle()
&& windowHandle()->screen() ? windowHandle()->screen() :
qApp->screens().front();
m_renderer->setupOSG(width(), height(), screen->devicePixelRatio());
m_renderer->addEventHandler(new osgViewer::StatsHandler());
m_renderer->setKeyEventSetsDone(0);
m_renderer->setQuitEventSetsDone(false);
}