2013-03-18 2 views
0

Я изменил osgViewerQt example, чтобы загрузить облако точек и визуализировать его в приложении Qt. Как видно из прилагаемого изображения, отображается облако облачной точки, но в окне есть дополнительная граница (см. Стрелки).OSG с QWidget показывает дополнительную границу

Extra borders in window

Я провел все выходные, пытаясь понять, как «расширить» окно для того, чтобы удалить эту границу, но он продолжает показывать.

Вы знаете, что я могу сделать для его удаления? Я отправлю код для модифицированного osgViewerQt и фрагмента кода, где я его использую.

viewer_widget.h

#ifndef VIEWER_WIDGET_H 
#define VIEWER_WIDGET_H 

#include "osgViewer/CompositeViewer" 

#include <QTimer> 
#include <QWidget> 

class QGridLayout; 
class QWidget; 

class ViewerWidget : public QWidget, public osgViewer::CompositeViewer { 
private: 
    std::string cloud_file; 
    std::string cloud_filepath; 
    QTimer timer_; 
    QWidget* widget; 
    QGridLayout* grid; 
    osg::ref_ptr<osgViewer::View> view; 
private: 
    ViewerWidget(const ViewerWidget& V); 
    ViewerWidget& operator=(const ViewerWidget& V); 
private: 
    QWidget* AddViewWidget(osg::Camera* camera,osg::Node* scene); 
    osg::Camera* CreateCamera(int x,int y,int w,int h,const std::string& name="", 
    bool windowDecoration=false 
); 
    osg::Node* ReadOctree(const std::string& file); 
public: 
    ViewerWidget(const std::string& filename,const std::string& filepath,bool color, 
    osgViewer::ViewerBase::ThreadingModel threadingModel 
     = osgViewer::CompositeViewer::ThreadPerCamera 
); 
    virtual ~ViewerWidget(void){} 
    void AddCloud(void); 
    void StartFrameTimer(int msec=10) { timer_.start(msec); } 
    virtual void paintEvent(QPaintEvent* event) { frame(); } 
}; 

#endif // VIEWER_WIDGET_H 

osg_viewer.cpp

#include "viewer_widget.h" 

#include "osgDB/ReadFile" 
#include "osgGA/TrackballManipulator" 
#include "osgQt/GraphicsWindowQt" 
#include "osgViewer/ViewerEventHandlers" 

#include <QGridLayout> 
#include <QDebug> 

ViewerWidget::ViewerWidget(const std::string &filename,const std::string &filepath, 
    bool color, osgViewer::ViewerBase::ThreadingModel threadingModel 
) : 
    QWidget(), 
    cloud_file(filename), 
    cloud_filepath(filepath) 
{ 
// this->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); 
    connect(&(this->timer_), SIGNAL(timeout()), this, SLOT(update())); 
} 

QWidget* ViewerWidget::AddViewWidget(osg::Camera *camera,osg::Node *scene) { 
    view = new osgViewer::View; 
    view->setCamera(camera); 
    view->setSceneData(scene); 

    osg::Stats* stats = this->getViewerStats(); 
    if(stats) stats->report(std::cout); 

    addView(view); 
    view->addEventHandler(new osgViewer::StatsHandler); 
    view->setCameraManipulator(new osgGA::TrackballManipulator); 
    osgQt::GraphicsWindowQt* gw = dynamic_cast<osgQt::GraphicsWindowQt*>(
    camera->getGraphicsContext() 
); 

    return gw ? gw->getGLWidget() : 0; 
} 

osg::Camera* ViewerWidget::CreateCamera(int x,int y,int w,int h,const std::string &name, 
    bool windowDecoration 
) { 
    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; 
    qDebug() << "w:" << w << " h:" << h; 
    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,0,0,1)); 
    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(); 
} 

osg::Node* ViewerWidget::ReadOctree(const std::string &file) { 
    osg::Group* group = new osg::Group; 
    group->addChild(osgDB::readNodeFile(file, options)); 
    return group; 
} 

void ViewerWidget::AddCloud() { 
    std::cout << "Loading cloud from file:" << cloud_file.c_str() << "\n"; 
    QWidget* widget = AddViewWidget(
    CreateCamera(0,0,100,100,"cam1",true), 
    ReadOctree(cloud_file) 
); 
    grid = new QGridLayout; 
    grid->addWidget(widget, 0, 0); 
    this->setLayout(grid); 
} 

Теперь, в котором используется этот виджет (немного упрощен, чтобы показать только соответствующие части):

cloud.h

#ifndef CLOUD_H 
    class Cloud: public QObject { 
    Q_OBJECT 
    private: 
    osg::ref_ptr<ViewerWidget> osg_widget; 
    QDockWidget* dock; 
    /// MORE ATTRIBUTES 
    public: 
    Cloud(){ 
     /// ... 
     dock = new QDockWidget; 
     osg_widget = new ViewerWidget(getFileName(), getFilePath(), has_color); 
     dockWidget->setAllowedAreas(Qt::RightDockWidgetArea); 
     dockWidget->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); 
     dockWidget->addWidget(osg_widget); 
    } 
    /// More methods, cloud manipulators, etc. 
    }; 
#endif 

При определении политики размера, я также попытался с Minimum, MinimumExpanding и Ignored, но с тем же эффектом. Я попытался указать политику размера непосредственно внутри ViewerWidget (так как он наследует от QWidget) и указать его атрибут виджета тоже, но без успеха.

ответ

1

Вы используете макет сетки, чтобы вставить виджет в целевом окне, если я правильно понимаю:

grid = new QGridLayout; 
grid->addWidget(widget, 0, 0); 
this->setLayout(grid); 

Макеты обычно вставляют прокладку вокруг их элементов (так называемый запас в документации Qt). Вы можете настроить, что с помощью QLayout::setContentsMargin(), так что здесь что-то в духе этого

grid->setContentsMargins(0,0,0,0); 

должен сделать трюк.

+0

Спасибо! Я должен был поставить маржу в 1, но в остальном она отлично работала !! –