带有QTDesigner的QVTKOpenGLWidget和vtkGenericOpenGlRenderWindow

Seb*_*247 3 c++ opengl qt viewer vtk

我正在尝试与QVTKOpenGLWidgetQTDesigner一起使用,vtkGenericOpenGlRenderWindow但获得了一个黑色窗口。当我将PCLVizualizerPointCloud Library(PCL)与一起使用时vtkGenericOpenGlRenderWindow,一切正常。我正在尝试以与PCL相同的方式创建自定义查看器。

QMainPanel::QMainPanel( HWND hWnd ) :
    QWinWidget( hWnd ),
    ui(new Ui::QMainPanel)
{
    ui->setupUi(this);

    rendererTest = vtkSmartPointer<vtkRenderer>::New();
    rendererTest->GradientBackgroundOn();
    rendererTest->SetBackground(0.27,0.27,0.27);
    rendererTest->SetBackground2(0.44,0.44,0.44);
    windowTest = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
    windowTest->AddRenderer(rendererTest);
    interactorTest = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    interactorTest->SetRenderWindow( windowTest );
    ui->openGLWidget->SetRenderWindow( windowTest ); //  QVTKOpenGLWidget *openGLWidget;
}
Run Code Online (Sandbox Code Playgroud)

谢谢

编辑:删除“交互器”解决了我的问题。

gil*_*ore 5

您将需要从https://github.com/PointCloudLibrary/pcl获得PCL的主版本。这将使PCLVisualizer具有更多的构造函数。因此,您可以使用这样的自定义小部件:

VideoQVTKOpenGLWidget.h



    #ifndef VIDEOQVKTOPENGLWIDGET_H
    #define VIDEOQVKTOPENGLWIDGET_H

    #include <QWidget>
    #include <QVTKOpenGLWidget.h>
    #include <pcl/visualization/pcl_visualizer.h>
    using namespace pcl::visualization;

    class VideoQVTKOpenGLWidget : public QVTKOpenGLWidget
    {
      public:
        explicit VideoQVTKOpenGLWidget(QWidget *parent = 0);
        void populateCloud(pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud);

      private:
        boost::shared_ptr<PCLVisualizer> _viewer;
        vtkSmartPointer<vtkGenericOpenGLRenderWindow> _renderWindow;
    };

    #endif // VIDEOQVKTOPENGLWIDGET_H

Run Code Online (Sandbox Code Playgroud)

VideoQVTKOpenGLWidget.cpp



    #include "VideoQVTKOpenGLWidget.h"

    #include <vtkPointPicker.h>
    #include <vtkGenericOpenGLRenderWindow.h>

    VideoQVTKOpenGLWidget::VideoQVTKOpenGLWidget(QWidget *parent)
      : QVTKOpenGLWidget(parent)
    {
      auto renderer = vtkSmartPointer<vtkRenderer>::New();
      _renderWindow = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
      _renderWindow->AddRenderer(renderer);
      _viewer.reset(new PCLVisualizer(renderer, _renderWindow, "viewer", false));
      this->SetRenderWindow(_viewer->getRenderWindow());
      this->update();
    }

    void VideoQVTKOpenGLWidget::populateCloud(pcl::PointCloud <pcl::PointXYZRGBA>::Ptr cloud)
    {
      if(!_viewer->updatePointCloud(cloud, "cloud")) {
        _viewer->addPointCloud(cloud, "cloud");
      }
      _renderWindow->Render();
    }

Run Code Online (Sandbox Code Playgroud)