0

我现在尝试了 2 个小时用 vtk 创建一个简单的图表,但没有任何成功。它只是不渲染任何东西,我不能调用 view->getRenderer()->render () 函数。它导致异常。

到目前为止我的理解是:

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

创建图表并添加后... view->getRenderer()->render();

我正在使用 vtk 7.1、qt 5.7 和 vs15。

我也试图在互联网上找到一个完整的例子,但我没有找到任何完整的例子。

有人可以举例说明如何用 qt 创建这样的 vtk 图表吗?

4

2 回答 2

2

According to this discussion on the vtk mailing list the widget and the view can be connected like this:

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

It seems like you're missing that second line. See below for a complete example.

#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();
}
于 2017-03-02T13:11:53.043 回答
0

我遇到了完全相同的问题(Qt 5.9,VTK 7.1),stfnp的解决方案对我不起作用。起作用的是与问题的源代码有些相反的方法,即:

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

代替

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

这对我来说似乎也更自然(要求视图在小部件提供的渲染窗口中渲染)。

于 2017-11-22T15:29:55.437 回答