Qt 如何在QVTKWidget中创建VTK图表

Qt 如何在QVTKWidget中创建VTK图表,qt,visual-c++,vtk,qvtkwidget,Qt,Visual C++,Vtk,Qvtkwidget,我现在尝试了两个小时,用vtk创建了一个简单的图表,但没有成功。它只是不渲染任何东西,我无法调用view->getRenderer()->render()函数。它会导致一个异常 到目前为止,我的理解是: vtkContextView* view = vtkContextView::New (); QVTKWidget* widget = new QVTKWidget (); widget->setRenderWindow (view->getRenderWindow ());

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

到目前为止,我的理解是:

vtkContextView* view = vtkContextView::New ();
QVTKWidget*  widget = new QVTKWidget (); 
widget->setRenderWindow (view->getRenderWindow ());
创建图表并添加后。。。 查看->获取渲染器()->渲染器()

我正在使用vtk7.1,qt5.7和vs15

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

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

根据小部件,视图可以这样连接:

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();
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
QApplication应用程序(argc、argv);
//准备绘图数据
auto table=vtkSmartPointer::New();
table->AddColumn(vtkSmartPointer::New());
table->AddColumn(vtkSmartPointer::New());
table->GetColumn(0)->SetName(“X”);
表->GetColumn(1)->SetName(“Y”);
表->设置行数(100);
对于(int i=0;i<100;++i)
{
表->设置值(i,0,i);
表->设定值(i,1,i*i);
}
//创建图表、视图和小部件
自动图表=vtkSmartPointer::New();
自动直线=图表->添加绘图(vtkChart::直线);
行->设置输入数据(表,0,1);
自动查看=vtkSmartPointer::New();
查看->获取场景()->添加项(图表);
自动小部件=新的QVTKWidget();
查看->设置交互器(小部件->获取交互器());
widget->SetRenderWindow(视图->GetRenderWindow());
widget->show();
返回app.exec();
}
根据小部件,视图可以如下连接:

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();
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
QApplication应用程序(argc、argv);
//准备绘图数据
auto table=vtkSmartPointer::New();
table->AddColumn(vtkSmartPointer::New());
table->AddColumn(vtkSmartPointer::New());
table->GetColumn(0)->SetName(“X”);
表->GetColumn(1)->SetName(“Y”);
表->设置行数(100);
对于(int i=0;i<100;++i)
{
表->设置值(i,0,i);
表->设定值(i,1,i*i);
}
//创建图表、视图和小部件
自动图表=vtkSmartPointer::New();
自动直线=图表->添加绘图(vtkChart::直线);
行->设置输入数据(表,0,1);
自动查看=vtkSmartPointer::New();
查看->获取场景()->添加项(图表);
自动小部件=新的QVTKWidget();
查看->设置交互器(小部件->获取交互器());
widget->SetRenderWindow(视图->GetRenderWindow());
widget->show();
返回app.exec();
}

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

view->SetRenderWindow(widget->GetRenderWindow());
而不是

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

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

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

view->SetRenderWindow(widget->GetRenderWindow());
而不是

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

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

我在…(vtkRenderingContext2D-8.0.dll)得到一个
未处理的异常。
来自
int-vtkContextActor::RenderOverlay(vtkViewport*视口)
并且在vtkoutput窗口中,我得到了
错误:没有为'vtkContextDevice2D
找到覆盖。我在…(vtkRenderingContext2D-8.0.dll)得到了
未处理的异常。
来自
int vtkContextActor::RenderOverlay(vtViewport*视口)
并且在vtkoutput窗口中,我得到了
错误:没有为'vtkContextDevice2D
找到覆盖。