Qt5 PCL 点云展示 对 QVTKOpenGLNativeWidget 封装

myqvtkopenglnativewidget.h

#ifndef MYQVTKOPENGLNATIVEWIDGET_H
#define MYQVTKOPENGLNATIVEWIDGET_H
#include <vtkRenderWindow.h>
#include <QVTKOpenGLNativeWidget.h>

// Point Cloud Library
#include <pcl/point_cloud.h>
#include <pcl/io/ply_io.h>
#include <pcl/filters/filter.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <pcl/PCLPointCloud2.h>
#include <pcl/visualization/range_image_visualizer.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/common/common.h>


// Boost
#include <boost/math/special_functions/round.hpp>
class MyQVTKOpenGLNativeWidget : public QVTKOpenGLNativeWidget
{
    Q_OBJECT
public:
    explicit MyQVTKOpenGLNativeWidget(QWidget *parent = nullptr);
    boost::shared_ptr<pcl::visualization::PCLVisualizer> getViewer();

signals:

protected:
    /** @brief The PCL visualizer object */
    boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer_;

};

#endif // MYQVTKOPENGLNATIVEWIDGET_H

myqvtkopenglnativewidget.cpp

#include "myqvtkopenglnativewidget.h"
#include <QSurfaceFormat>
#include <QVTKOpenGLNativeWidget.h>
#include <vtkSphereSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkGenericOpenGLRenderWindow.h>
#include <vtkNamedColors.h>
#include <vtkProperty.h>
#include <vtkSmartPointer.h>

#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
VTK_MODULE_INIT(vtkRenderingFreeType);


#include <vtkCubeSource.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkAxesActor.h>
#include <vtkOrientationMarkerWidget.h>

MyQVTKOpenGLNativeWidget::MyQVTKOpenGLNativeWidget(QWidget *parent)
    : QVTKOpenGLNativeWidget{parent}
{
    auto renderer2 = vtkSmartPointer<vtkRenderer>::New();
    auto renderWindow2 = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
    renderWindow2->AddRenderer(renderer2);
    viewer_.reset(new pcl::visualization::PCLVisualizer(renderer2, renderWindow2, "viewer", false));
    viewer_->setBackgroundColor(255, 255, 255);
    viewer_->setShowFPS(false);
    setRenderWindow(viewer_->getRenderWindow());
    viewer_->setupInteractor(this->interactor(), this->renderWindow());




    vtkAxesActor* axesActor =vtkAxesActor::New();
    axesActor->SetPosition(0, 0, 0);		//坐标系的原点位置
    axesActor->SetTotalLength(1, 1, 1);	//轴的长度
    axesActor->SetShaftType(0);	 //旋转轴的类型:圆柱体、线或者自定义(用于显示)
    axesActor->SetAxisLabels(1);  //是否显示标签
    axesActor->SetCylinderRadius(0.02);
    vtkOrientationMarkerWidget* widgetAxes =vtkOrientationMarkerWidget::New();
    widgetAxes->SetOrientationMarker(axesActor);
    widgetAxes->SetInteractor(this->interactor());
    widgetAxes->SetEnabled(1);
    widgetAxes->SetInteractive(0);
    this->update();
}
boost::shared_ptr<pcl::visualization::PCLVisualizer> MyQVTKOpenGLNativeWidget::getViewer(){
    return viewer_;
}

如果要在UI设计师界面中使用,先拖入openglWidget ,然后将这部件提升为MyQVTKOpenGLNativeWidget