osgEarth не виден в виджете Qt с 0 полями - PullRequest
0 голосов
/ 28 мая 2019

У меня возникают проблемы при попытке отобразить виджет osgEarth в окне Qt при установке полей виджета равным 0.

Я использую osgQt & osgEarth 2.10 & osg 3.6.3 с Qt 5.12 в Windows 10. Кажется, все работает, и я следую примеру OsgQt Viewer для настройки моей программы. Мой виджет osg, когда он добавлен в мой фрейм, имеет поле по умолчанию и интервал, поэтому, когда я устанавливаю его в свой центральный виджет (в QMainWidget), он имеет серую рамку. Однако, когда я устанавливаю поля равными 0, карта вообще не будет рисоваться, и на нем будут видны некоторые артефакты по краю виджета.

Вот что я делаю:

OsgViewerQWidget::OsgViewerQWidget(QWidget* parent /*= 0*/, Qt::WindowFlags f /*= 0*/, QStatusBar* statusBar /*= 0*/) 
: QWidget(parent, f) 
{ 
 _map = new osgEarth::Map(); 

// add a TMS imagery layer: 
osgEarth::Drivers::TMSOptions imagery; 
imagery.url() = "http://readymap.org/readymap/tiles/1.0.0/7/"; 
_map->addLayer(new osgEarth::ImageLayer("ReadyMap Imagery", imagery)); 

// add a TMS elevation layer: 
osgEarth::Drivers::TMSOptions elevation; 
elevation.url() = "http://readymap.org/readymap/tiles/1.0.0/116/"; 
_map->addLayer(new osgEarth::ElevationLayer("ReadyMap Elevation", elevation)); 

graticuleLayer = new osgEarth::Util::GeodeticGraticule(); 
_map->addLayer(graticuleLayer); 

// That's it, the map is ready; now create a MapNode to render the Map: 
_mapNode = new osgEarth::MapNode(_map); 

_mapNode->setNodeMask(0x1); 

setThreadingModel(osgViewer::ViewerBase::SingleThreaded); 

// disable the default setting of viewer.done() by pressing Escape. 
setKeyEventSetsDone(0); 

QWidget* widget1 = AddViewWidget(CreateGraphicsWindow(0, 0, 100, 100), _mapNode, statusBar); 

QGridLayout* grid = new QGridLayout; 
setLayout(grid); 

grid->setSpacing(0); 
//grid->setContentsMargins(0, 0, 0, 0);   ////// with this line commented out, it works, with it in, it doesn't work... but, why?! 
grid->addWidget(widget1); 

connect(&_timer, SIGNAL(timeout()), this, SLOT(update())); 
_timer.start(10); 
} 

osgQt::GraphicsWindowQt* OsgViewerQWidget::CreateGraphicsWindow(int x, int y, int w, int h, const std::string& name /*= ""*/, bool windowDecoration /*= false*/) 
{ 
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(); 

return new osgQt::GraphicsWindowQt(traits.get()); 
} 

QWidget* OsgViewerQWidget::AddViewWidget(osgQt::GraphicsWindowQt* gw, osg::ref_ptr<osg::Node> scene, QStatusBar *statusBar) 
{ 
osgViewer::View* view = new osgViewer::View; 
addView(view); 

osg::Camera* camera = view->getCamera(); 
camera->setGraphicsContext(gw); 

// need to do this to make lines show up... o_O  Thanks's Glenn! 
osgEarth::Util::GLUtils::setGlobalDefaults(camera->getOrCreateStateSet()); 

const osg::GraphicsContext::Traits* traits = gw->getTraits(); 

camera->setClearColor(osg::Vec4(0.2, 0.2, 0.6, 1.0)); 
camera->setViewport(new osg::Viewport(0, 0, traits->width, traits->height)); 

// set the draw and read buffers up for a double buffered window with rendering going to back buffer 
camera->setDrawBuffer(GL_BACK); 
camera->setReadBuffer(GL_BACK); 

camera->setProjectionMatrixAsPerspective(30.0f, static_cast<double>(traits->width) / static_cast<double>(traits->height), 1.0f, 10000.0f); 

view->setSceneData(scene); 
view->addEventHandler(new osgViewer::StatsHandler); 
view->addEventHandler(new osgGA::StateSetManipulator(view->getCamera()->getOrCreateStateSet())); 
view->addEventHandler(new osgViewer::ThreadingHandler()); 
view->addEventHandler(new osgViewer::LODScaleHandler()); 
view->addEventHandler(new osgViewer::ScreenCaptureHandler()); 

earthManip = new osgEarth::Util::EarthManipulator; 
view->setCameraManipulator(earthManip); 

ldBuffer = new osgEarth::Util::LogarithmicDepthBuffer; 
ldBuffer->install(camera); 

gw->setTouchEventsEnabled(true); 
return gw->getGLWidget(); 
} 

Это загружается в QMainWidget, где я создаю экземпляр OsgViewingQWidget:

viewWidget = new OsgViewerQWidget(0, Qt::Widget, ui.statusBar);
viewWidget->SetViewpoint(21.306622, -157.934527, 0);

setCentralWidget(viewWidget);

Независимо от того, установил ли я родительский элемент в 0 или этот, это ничего не меняет.

Когда поля установлены, он покажет синий фон (как будто он пытается загрузить базовый слой или что-то в этом роде, и я увижу немного серой линии в левом нижнем углу окна, а сверху справа от окна. Карта или что-либо еще никогда не отображается, но я также не вижу никаких ошибок консоли.

Любая помощь будет принята с благодарностью! Дэвид

...