C++ 使用图形功能时出现分段错误(vtk 6.1、Qt5.3、Ubuntu)

C++ 使用图形功能时出现分段错误(vtk 6.1、Qt5.3、Ubuntu),c++,qt,vtk,qvtkwidget,C++,Qt,Vtk,Qvtkwidget,更新:调试信息 我正在从事Qt5.3项目,需要在二维和三维坐标系中绘制数据。我一直在研究VTK6.1,因为它总体上看起来非常强大,我还需要在稍后将图像数据可视化。我已经在这个例子中顺利地使用了Qvtkwidget #包括“mainwindow.h” #包括 #包括 VTK_模块初始化(vtkRenderingOpenGL); #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 int main(int argc,字符**argv) { QApplication应用程

更新:调试信息

我正在从事Qt5.3项目,需要在二维和三维坐标系中绘制数据。我一直在研究VTK6.1,因为它总体上看起来非常强大,我还需要在稍后将图像数据可视化。我已经在这个例子中顺利地使用了Qvtkwidget

#包括“mainwindow.h”
#包括
#包括
VTK_模块初始化(vtkRenderingOpenGL);
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{
QApplication应用程序(argc、argv);
QVTKWidget小部件;
widget.resize(256256);
//设置球
VTKSmart指针球形资源=
vtkSmartPointer::New();
sphereSource->Update();
VTKSmart指针球形映射器=
vtkSmartPointer::New();
sphereMapper->SetInputConnection(sphereSource->GetOutputPort());
vtkSmartPointer球体发生器=
vtkSmartPointer::New();
sphereActor->SetMapper(sphereMapper);
//设置窗口
vtkSmartPointer渲染窗口=
vtkSmartPointer::New();
//设置渲染器
VTKSmart指针渲染器=
vtkSmartPointer::New();
renderWindow->AddRenderer(渲染器);
渲染器->添加器(sphereActor);
渲染器->重置摄影机();
SetRenderWindow(renderWindow);
widget.show();
app.exec();
返回退出成功;
}
但是当我尝试实现图形示例(/Examples/Charts/Cxx/QChartTable.Cxx)时,程序显示了分段错误

#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL)
#include "vtkFloatArray.h"
#include "vtkMath.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"

#include "vtkSmartPointer.h"

#include "vtkContextView.h"
#include "vtkContextScene.h"
#include "vtkChartXY.h"
#include "vtkPlot.h"
#include "vtkTable.h"

#include "vtkTimerLog.h"

#include <QApplication>
#include <QWidget>
#include <QMainWindow>
#include <QHBoxLayout>

#include "QVTKWidget.h"
#include "vtkQtTableView.h"

#define VTK_CREATE(type, name) \
  vtkSmartPointer<type> name = vtkSmartPointer<type>::New()

int main(int argc, char** argv)
{


  // Qt initialization
  QApplication app(argc, argv);
  QMainWindow mainWindow;
  mainWindow.setGeometry(0, 0, 1150, 600);

  // QVTK set up and initialization
  QVTKWidget *qvtkWidget = new QVTKWidget(&mainWindow);

  // Set up my 2D world...
  VTK_CREATE(vtkContextView, view); // This contains a chart object
  view->SetInteractor(qvtkWidget->GetInteractor());
  qvtkWidget->SetRenderWindow(view->GetRenderWindow());

  // Create a table with some points in it...
  VTK_CREATE(vtkTable, table);
  VTK_CREATE(vtkFloatArray, arrX);
  arrX->SetName("X Axis");
  table->AddColumn(arrX);
  VTK_CREATE(vtkFloatArray, arrC);
  arrC->SetName("Cosine");
  table->AddColumn(arrC);
  VTK_CREATE(vtkFloatArray, arrS);
  arrS->SetName("Sine");
  table->AddColumn(arrS);

  // Make a timer object - need to get some frame rates/render times
  VTK_CREATE(vtkTimerLog, timer);

  // Test charting with a few more points...
  int numPoints = 29;
  float inc = 7.0 / (numPoints-1);
  table->SetNumberOfRows(numPoints);
  for (int i = 0; i < numPoints; ++i)
    {
    table->SetValue(i, 0, i * inc);
    table->SetValue(i, 1, cos(i * inc) + 0.0);
    table->SetValue(i, 2, sin(i * inc) + 0.0);
    }

//   table->Update();

  // Add multiple line plots, setting the colors etc
  vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
  view->GetScene()->AddItem(chart);
  vtkPlot *line = chart->AddPlot(vtkChart::LINE);
  line->SetInputData(table, 0, 1);
  line->SetColor(255, 0, 0, 255);
  line = chart->AddPlot(vtkChart::LINE);
  line->SetInputData(table, 0, 2);
  line->SetColor(0, 255, 0, 255);
  line->SetWidth(2.0);

  // Instantiate a vtkQtChart and use that too
/*  vtkQtChart *qtChart = new vtkQtChart;
  chart = qtChart->chart();
  line = chart->AddPlot(vtkChart::LINE);
  line->SetTable(table, 0, 1);
  line->SetColor(255, 0, 0, 255);
  line = chart->AddPlot(vtkChart::LINE);
  line->SetTable(table, 0, 2);
  line->SetColor(0, 255, 0, 255);
  line->SetWidth(2.0);
*/
  // Now lets try to add a table view
  QWidget *widget = new QWidget(&mainWindow);
  QHBoxLayout *layout = new QHBoxLayout(widget);
  VTK_CREATE(vtkQtTableView, tableView);
  tableView->SetSplitMultiComponentColumns(true);
  tableView->AddRepresentationFromInput(table);
  tableView->Update();
  layout->addWidget(qvtkWidget, 2);
  //layout->addWidget(qtChart, 2);
  layout->addWidget(tableView->GetWidget());
  mainWindow.setCentralWidget(widget);

  // Now show the application and start the event loop
  mainWindow.show();

  return app.exec();
}
#包括
VTK_模块初始化(vtkRenderingOpenGL)
#包括“vtkFloatArray.h”
#包括“vtkMath.h”
#包括“vtkrender.h”
#包括“vtcrenderwindow.h”
#包括“vtkRenderWindowInteractor.h”
#包括“vtkSmartPointer.h”
#包括“vtkContextView.h”
#包括“vtkContextScene.h”
#包括“vtkChartXY.h”
#包括“vtkPlot.h”
#包括“vtkTable.h”
#包括“vtkTimerLog.h”
#包括
#包括
#包括
#包括
#包括“QVTKWidget.h”
#包括“vtkQtTableView.h”
#定义VTK_创建(类型、名称)\
vtkSmartPointer name=vtkSmartPointer::New()
int main(int argc,字符**argv)
{
//Qt初始化
QApplication应用程序(argc、argv);
QMainWindow主窗口;
主窗口.setGeometry(0,0,1150600);
//QVTK设置和初始化
QVTKWidget*QVTKWidget=新的QVTKWidget(&main窗口);
//设置我的2D世界。。。
VTK_CREATE(vtkContextView,view);//这包含一个图表对象
查看->设置交互器(qvtkWidget->获取交互器());
qvtkWidget->SetRenderWindow(视图->GetRenderWindow());
//创建一个包含一些点的表格。。。
VTK_创建(vtkTable,table);
VTK_创建(vtkFloatArray,arrX);
arrX->SetName(“X轴”);
表->添加列(arrX);
VTK_创建(vtkFloatArray,arrC);
arrC->SetName(“余弦”);
表->添加列(arrC);
VTK_创建(vtkFloatArray,arrS);
arrS->SetName(“正弦”);
表->添加列(arrS);
//制作计时器对象-需要获得一些帧速率/渲染时间
VTK_创建(vtkTimerLog,计时器);
//测试图表与一些更多的点。。。
int numPoints=29;
浮动公司=7.0/(numPoints-1);
表->SetNumberOfRows(numPoints);
对于(int i=0;i设置值(i,0,i*inc);
表->设定值(i,1,cos(i*inc)+0.0);
表->设定值(i,2,sin(i*inc)+0.0);
}
//表->更新();
//添加多个线条图,设置颜色等
vtkSmartPointer chart=vtkSmartPointer::New();
查看->获取场景()->添加项(图表);
vtkPlot*line=chart->AddPlot(vtkChart::line);
行->设置输入数据(表,0,1);
行->设置颜色(255,0,0,255);
line=图表->添加绘图(vtkChart::line);
行->设置输入数据(表,0,2);
行->设置颜色(0,255,0,255);
行->设置宽度(2.0);
//实例化vtkQtChart并使用它
/*vtkQtChart*qtChart=新vtkQtChart;
chart=qtChart->chart();
line=图表->添加绘图(vtkChart::line);
行->可设置(表,0,1);
行->设置颜色(255,0,0,255);
line=图表->添加绘图(vtkChart::line);
行->可设置(表,0,2);
行->设置颜色(0,255,0,255);
行->设置宽度(2.0);
*/
//现在,让我们尝试添加一个表视图
QWidget*widget=新的QWidget(&mainWindow);
QHBoxLayout*布局=新的QHBoxLayout(小部件);
VTK_创建(vtkQtTableView,tableView);
tableView->SetPlitMultiComponentColumns(真);
tableView->AddRepresentationFromInput(表格);
tableView->Update();
布局->添加小部件(qvtkWidget,2);
//布局->添加小部件(qtChart,2);
布局->添加小部件(tableView->GetWidget());
mainWindow.setCentralWidget(小部件);
//现在显示应用程序并启动事件循环
mainWindow.show();
返回app.exec();
}
我不知道这个错误是怎么发生的


我已经在调试模式下重新编译了VTK,并获得了更多调试信息。这是该程序的回溯。在这个屏幕截图中,问题可能来自“this”指针,“this”应该是vtkTextRenderer*但“this”指向空指针。我认为这可能是VTK 6.1中的一个错误,但不知道如何修复它。请给我一些建议。谢谢

我是新手,仍然不能发布图片,所以我上传到这个链接

0 VTKTextender::GetBoundingBox VTKTextender.h 136 0x7ffff0fbda58
1 VTKTextrenderStringToImage::GetBounds VTKTextrenderStringToImage.cxx 62 0x7ffff0fbd68b
2 vtkOpenGLContextDevice2D::ComputeTestRingBounds vtkOpenGLContextDevice2D.cxx 885 0x7FF650D338
3 vtkOpenGLContextDevice2D::ComputeTestRingBounds vtkOpenGLContextDevice2D.cxx 809 0x7ffff650cab4
4 vtkContext2D::ComputeStringBounds vtkContext2D.cxx 619 0x7ffff64f24dd
5 vtkAxis::GetBoundingRect vtkAxis.cxx 871 0x7ffff7a9d66d
6 vtkChartXY::更新vtkChartXY.cxx 762 0x7ffff7ac6064
7 vtkChartXY::绘制vtkChartXY.cxx 325 0x7ffff7ac4450
8 vtkContextScenePrivate::PaintItems vtkContextScenePrivate.h 80 0x7ffff64ea83a
9 vtkContextScene::绘制vtkContextScene.cxx 120 0x7ffff64fc2f2
10 vtkContextActor::RenderOverrlay vtkContextActor.cxx 23
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL)
#include "vtkFloatArray.h"
#include "vtkMath.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"

#include "vtkSmartPointer.h"

#include "vtkContextView.h"
#include "vtkContextScene.h"
#include "vtkChartXY.h"
#include "vtkPlot.h"
#include "vtkTable.h"

#include "vtkTimerLog.h"

#include <QApplication>
#include <QWidget>
#include <QMainWindow>
#include <QHBoxLayout>

#include "QVTKWidget.h"
#include "vtkQtTableView.h"

#define VTK_CREATE(type, name) \
  vtkSmartPointer<type> name = vtkSmartPointer<type>::New()

int main(int argc, char** argv)
{


  // Qt initialization
  QApplication app(argc, argv);
  QMainWindow mainWindow;
  mainWindow.setGeometry(0, 0, 1150, 600);

  // QVTK set up and initialization
  QVTKWidget *qvtkWidget = new QVTKWidget(&mainWindow);

  // Set up my 2D world...
  VTK_CREATE(vtkContextView, view); // This contains a chart object
  view->SetInteractor(qvtkWidget->GetInteractor());
  qvtkWidget->SetRenderWindow(view->GetRenderWindow());

  // Create a table with some points in it...
  VTK_CREATE(vtkTable, table);
  VTK_CREATE(vtkFloatArray, arrX);
  arrX->SetName("X Axis");
  table->AddColumn(arrX);
  VTK_CREATE(vtkFloatArray, arrC);
  arrC->SetName("Cosine");
  table->AddColumn(arrC);
  VTK_CREATE(vtkFloatArray, arrS);
  arrS->SetName("Sine");
  table->AddColumn(arrS);

  // Make a timer object - need to get some frame rates/render times
  VTK_CREATE(vtkTimerLog, timer);

  // Test charting with a few more points...
  int numPoints = 29;
  float inc = 7.0 / (numPoints-1);
  table->SetNumberOfRows(numPoints);
  for (int i = 0; i < numPoints; ++i)
    {
    table->SetValue(i, 0, i * inc);
    table->SetValue(i, 1, cos(i * inc) + 0.0);
    table->SetValue(i, 2, sin(i * inc) + 0.0);
    }

//   table->Update();

  // Add multiple line plots, setting the colors etc
  vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
  view->GetScene()->AddItem(chart);
  vtkPlot *line = chart->AddPlot(vtkChart::LINE);
  line->SetInputData(table, 0, 1);
  line->SetColor(255, 0, 0, 255);
  line = chart->AddPlot(vtkChart::LINE);
  line->SetInputData(table, 0, 2);
  line->SetColor(0, 255, 0, 255);
  line->SetWidth(2.0);

  // Instantiate a vtkQtChart and use that too
/*  vtkQtChart *qtChart = new vtkQtChart;
  chart = qtChart->chart();
  line = chart->AddPlot(vtkChart::LINE);
  line->SetTable(table, 0, 1);
  line->SetColor(255, 0, 0, 255);
  line = chart->AddPlot(vtkChart::LINE);
  line->SetTable(table, 0, 2);
  line->SetColor(0, 255, 0, 255);
  line->SetWidth(2.0);
*/
  // Now lets try to add a table view
  QWidget *widget = new QWidget(&mainWindow);
  QHBoxLayout *layout = new QHBoxLayout(widget);
  VTK_CREATE(vtkQtTableView, tableView);
  tableView->SetSplitMultiComponentColumns(true);
  tableView->AddRepresentationFromInput(table);
  tableView->Update();
  layout->addWidget(qvtkWidget, 2);
  //layout->addWidget(qtChart, 2);
  layout->addWidget(tableView->GetWidget());
  mainWindow.setCentralWidget(widget);

  // Now show the application and start the event loop
  mainWindow.show();

  return app.exec();
}
0   vtkTextRenderer::GetBoundingBox vtkTextRenderer.h   136 0x7ffff0fbda58  
1   vtkTextRendererStringToImage::GetBounds vtkTextRendererStringToImage.cxx    62  0x7ffff0fbd68b  
2   vtkOpenGLContextDevice2D::ComputeStringBounds   vtkOpenGLContextDevice2D.cxx    885 0x7ffff650d338  
3   vtkOpenGLContextDevice2D::ComputeStringBounds   vtkOpenGLContextDevice2D.cxx    809 0x7ffff650cab4  
4   vtkContext2D::ComputeStringBounds   vtkContext2D.cxx    619 0x7ffff64f24dd  
5   vtkAxis::GetBoundingRect    vtkAxis.cxx 871 0x7ffff7a9d66d  
6   vtkChartXY::UpdateLayout    vtkChartXY.cxx  762 0x7ffff7ac6064  
7   vtkChartXY::Paint   vtkChartXY.cxx  325 0x7ffff7ac4450  
8   vtkContextScenePrivate::PaintItems  vtkContextScenePrivate.h    80  0x7ffff64ea83a  
9   vtkContextScene::Paint  vtkContextScene.cxx 120 0x7ffff64fc2f2  
10  vtkContextActor::RenderOverlay  vtkContextActor.cxx 239 0x7ffff64f5787  
11  vtkRenderer::UpdateGeometry vtkRenderer.cxx 585 0x7ffff3518bc3  
12  vtkOpenGLRenderer::DeviceRender vtkOpenGLRenderer.cxx   270 0x7ffff61102c0  
13  vtkRenderer::Render vtkRenderer.cxx 292 0x7ffff3517dfb  
14  vtkRendererCollection::Render   vtkRendererCollection.cxx   51  0x7ffff35164d3  
15  vtkRenderWindow::DoStereoRender vtkRenderWindow.cxx 759 0x7ffff352bc36  
16  vtkRenderWindow::DoFDRender vtkRenderWindow.cxx 728 0x7ffff352bb46  
17  vtkRenderWindow::DoAARender vtkRenderWindow.cxx 607 0x7ffff352b4f2  
18  vtkRenderWindow::Render vtkRenderWindow.cxx 423 0x7ffff352aac2  
19  vtkXOpenGLRenderWindow::Render  vtkXOpenGLRenderWindow.cxx  1831    0x7ffff61abc51  
20  vtkRenderWindowInteractor::Render   vtkRenderWindowInteractor.cxx   168 0x7ffff3537751  
... <More>              
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingFreeType);