2016-11-29 22 views
0

我現在嘗試了2個小時,創建了一個簡單的vtk圖表,但沒有任何成功。它只是不渲染任何東西,我不能調用view-> getRenderer() - > render()函數。它導致一個例外。如何在QVTKWidget中創建一個VTK圖表

我明白了什麼至今:

vtkContextView* view = vtkContextView::New(); 
QVTKWidget* widget = new QVTKWidget(); 
widget->setRenderWindow (view->getRenderWindow()); 

創建圖表,添加完後... 視圖 - > getRenderer() - >渲染();

我使用的是vtk 7.1,qt 5.7與vs15。

我也嘗試在互聯網上找到一個完整的例子,但我還沒有找到任何完整的例子。

有人可以舉例說明如何用qt創建這樣的vtk圖表嗎?

回答

1

根據this discussion on the vtk mailing list小部件和視圖可以連接這樣的:

widget->SetRenderWindow(view->GetRenderWindow()); 
view->SetInteractor(widget->GetInteractor()); 

好像你缺少第二行。請參閱下面的完整示例。

#include <QtWidgets> 

#include <QVTKWidget.h> 
#include <vtkSmartPointer.h> 
#include <vtkDoubleArray.h> 
#include <vtkChartXY.h> 
#include <vtkTable.h> 
#include <vtkPlot.h> 
#include <vtkContextView.h> 
#include <vtkContextScene.h> 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 

    // Prepare plot data 

    auto table = vtkSmartPointer<vtkTable>::New(); 
    table->AddColumn(vtkSmartPointer<vtkDoubleArray>::New()); 
    table->AddColumn(vtkSmartPointer<vtkDoubleArray>::New()); 
    table->GetColumn(0)->SetName("X"); 
    table->GetColumn(1)->SetName("Y"); 

    table->SetNumberOfRows(100); 
    for(int i = 0; i < 100; ++i) 
    { 
     table->SetValue(i, 0, i); 
     table->SetValue(i, 1, i*i); 
    } 

    // Create chart, view and widget 

    auto chart = vtkSmartPointer<vtkChartXY>::New(); 
    auto line = chart->AddPlot(vtkChart::LINE); 
    line->SetInputData(table, 0, 1); 

    auto view = vtkSmartPointer<vtkContextView>::New(); 
    view->GetScene()->AddItem(chart); 

    auto widget = new QVTKWidget(); 
    view->SetInteractor(widget->GetInteractor()); 
    widget->SetRenderWindow(view->GetRenderWindow()); 
    widget->show(); 

    return app.exec(); 
} 
+0

我從'vtkContextActor :: RenderOverlay(vtkViewport * viewport)'得到一個'未處理的異常...(vtkRenderingContext2D-8.0.dll)'並且在vtkOutputWindow中我得到了'錯誤:未發現'vtkContextDevice2D' 。 – remi000

0

我有完全相同的問題(QT 5.9,VTK 7.1)和stfnp的解決方案並沒有爲我工作。什麼做的工作是對問題的源代碼有點相反的方法,即:

view->SetRenderWindow(widget->GetRenderWindow()); 

代替

widget->setRenderWindow(view->getRenderWindow()); 

這也似乎對我來說更自然(要求視圖渲染渲染窗口提供的窗口)。