2017-04-19 60 views
0

我想在QTDesigner中使用QVTKOpenGLWidgetvtkGenericOpenGlRenderWindow但我获得一个黑色的窗口。当我使用vtkGenericOpenGlRenderWindow的PointCloud Library(PCL)的PCLVizualizer时,一切正常。我正在尝试以与PCL相同的方式创建自定义查看器。QVTKOpenGLWidget和vtkGenericOpenGlRenderWindow与QTDesigner

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; 
} 

谢谢

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

+0

了:)我的问题不解决:( – Sebastien247

+1

你应该避免编辑你的问题来标记它已经解决了,而是写一个完整的答案给你的原始问题,解释你是如何解决你的问题的,然后你可以接受你自己的答案。 s在堆栈溢出规则方面是完全有效的,并且使未来的读者容易理解问题和解决方案 – Antwane

回答

0

您将需要获得PCL形式的主版本https://github.com/PointCloudLibrary/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 

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(); 
    }