Qt 你好 | 专注于Qt的技术分享平台
一,新建一个 QOsgWidget 类,继承自osgQOpenGLWidget
#ifndef QOSGWIDGET_H #define QOSGWIDGET_H #include <QObject> #include <osgViewer/Viewer> #include <osgQOpenGL/osgQOpenGLWidget> class QOsgWidget: public osgQOpenGLWidget { public: explicit QOsgWidget(QWidget *parent = nullptr); QSize sizeHint() const; void InitQOsgWidget(); }; #endif // QOSGWIDGET_H
#include "qosgwidget.h" #include <QDebug> QOsgWidget::QOsgWidget(QWidget *parent):osgQOpenGLWidget(parent) { //多重采样 QSurfaceFormat surfaceFormat; surfaceFormat.setSamples(6); setFormat(surfaceFormat); } QSize QOsgWidget::sizeHint() const { return QSize(this->width(),this->height()); }
二,UI中创建一个QWidget 并提升为QOsgWidget
三,主窗初始化这个QOsgWidget。 这里以一个 网格 节点为例。
#ifndef WIDGET_H #define WIDGET_H #include <osg/Node> #include <QWidget> #include "qosgwidget.h" QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = nullptr); ~Widget(); private: Ui::Widget *ui; void InitQOsgWidget(); osg::ref_ptr<osg::Group> _Root = nullptr; osg::ref_ptr<osgViewer::Viewer> _Viewer = nullptr; }; #endif // WIDGET_H
#include "widget.h" #include "ui_widget.h" #include <osgGA/TrackballManipulator> #include <osgUtil/Optimizer> #include <osgGA/GUIEventHandler> #include <osgViewer/ViewerEventHandlers> Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); connect(ui->widget, &osgQOpenGLWidget::initialized, this, &Widget::InitQOsgWidget); } Widget::~Widget() { delete ui; } void Widget::InitQOsgWidget() { _Root = new osg::Group(); QSize size = ui->widget->size(); osg::ref_ptr<osgGA::TrackballManipulator> trackball = new osgGA::TrackballManipulator; trackball->setAllowThrow(false); trackball->setAutoComputeHomePosition(true); trackball->setThreadSafeRefUnref(true); osgUtil::Optimizer optimizer; optimizer.optimize(_Root.get()); _Viewer = ui->widget->getOsgViewer(); _Viewer->addEventHandler(new osgViewer::StatsHandler); _Viewer->getCamera()->setClearColor(osg::Vec4(0.2, 0.2, 0.2, 1)); _Viewer->getCamera()->setProjectionMatrixAsPerspective(30.0f, static_cast<double>(size.width())/static_cast<double>(size.height()), 1.0f, 10000.0f ); _Viewer->setCameraManipulator(trackball); _Viewer->setRunMaxFrameRate(60); osg::ref_ptr<osg::Geode> grid = new osg::Geode; osg::Geometry* geom = new osg::Geometry; grid->addChild(geom); osg::Vec3Array* vertex = new osg::Vec3Array; geom->setVertexArray(vertex); //沿xy平面画线,间隔500米,从-10000,画到100000 for (int i = -10; i <= 10; i += 1) { vertex->push_back(osg::Vec3(i, -10, 0)); vertex->push_back(osg::Vec3(i, 10, 0)); vertex->push_back(osg::Vec3(-10, i, 0)); vertex->push_back(osg::Vec3(10, i, 0)); } geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES, 0, vertex->size())); osg::Vec4Array* color = new osg::Vec4Array(); color->push_back(osg::Vec4(0.7, 0.7, 0.7, 1.0)); geom->setColorArray(color, osg::Array::BIND_OVERALL); geom->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF); _Root->addChild(grid); _Viewer->setSceneData(_Root.get()); }
四,效果
集成OSG | Qt 你好