2017-04-19 90 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(); 
    }