VTK 示例不工作 - QVTKOpenGLWidget?

VTK Examples not working - QVTKOpenGLWidget?

我尝试进入 Qt 和 VTK,但我遇到了很多障碍才能走到这一步。 google 和 Whosebug 帮助了我 quite 很多,但我无法自己解决这个问题。它是关于 QVTKOpenGLWidget 的。我不知道如何得到这个,这个例子对我不起作用:

https://lorensen.github.io/VTKExamples/site/Cxx/Qt/RenderWindowUISingleInheritance/

我还必须将以下行添加到 CMakeLists.txt:

SET(VTK_DIR "/path/to/cmake/vtk-8.0" CACHE PATH "VTK directory override" FORCE)

如果我尝试 运行 它,我会收到以下错误消息:

RenderWindowUISingleInheritance.cxx:21:53: 错误:没有匹配函数来调用‘QVTKOpenGLWidget::SetRenderWindow(vtkNew&)’ this->ui->qvtkWidget->SetRenderWindow(renderWindow);

RenderWindowUISingleInheritance.cxx:34:33: 错误:没有匹配函数来调用‘vtkRenderer::AddActor(vtkNew&)’ 渲染器->AddActor(sphereActor);

RenderWindowUISingleInheritance.cxx:37:64: 错误:没有匹配函数来调用‘vtkRenderWindow::AddRenderer(vtkNew&)’ this->ui->qvtkWidget->GetRenderWindow()->AddRenderer(renderer);

我不知道这个 QVTKOpenGLWidget 是从哪里来的,我是怎么得到它的,但看起来你必须使用它而不是 Qt5 的 QVTKOpenWidget,但它似乎不起作用?一般来说,我对 Qt 或 VTK 没有太多经验。所以它可能很容易解决。

RenderWindowUISingleInheritance.cxx:

#include "RenderWindowUISingleInheritance.h"
// This is included here because it is forward declared in
// RenderWindowUISingleInheritance.h
#include "ui_RenderWindowUISingleInheritance.h"

#include <vtkGenericOpenGLRenderWindow.h>
#include <vtkNew.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkSphereSource.h>

// Constructor
RenderWindowUISingleInheritance::RenderWindowUISingleInheritance()
{
  this->ui = new Ui_RenderWindowUISingleInheritance;
  this->ui->setupUi(this); //*1

  vtkNew<vtkGenericOpenGLRenderWindow> renderWindow;
  this->ui->qvtkWidget->SetRenderWindow(renderWindow); //*2


  // Sphere
  vtkNew<vtkSphereSource> sphereSource;
  sphereSource->Update();
  vtkNew<vtkPolyDataMapper> sphereMapper;
  sphereMapper->SetInputConnection(sphereSource->GetOutputPort());
  vtkNew<vtkActor> sphereActor;
  sphereActor->SetMapper(sphereMapper); //*3

  // VTK Renderer
  vtkNew<vtkRenderer> renderer;
  renderer->AddActor(sphereActor); //*4

  // VTK/Qt wedded
  this->ui->qvtkWidget->GetRenderWindow()->AddRenderer(renderer); //*5

  // Set up action signals and slots
  connect(this->ui->actionExit, SIGNAL(triggered()), this, SLOT(slotExit())); //*6

}

void RenderWindowUISingleInheritance::slotExit()
{
  qApp->exit(); //*7
}

它还告诉我以下内容(在代码中用 //*X 标记的行):

  1. Class 'Ui_RenderWindowUISingleInheritance' 没有函数 'setupUI'
  2. Class 'Ui_RenderWindowUISingleInheritance' 没有字段 'qvtkWidget'
  3. 参数类型不匹配:'vtkMapper*' 和 'vtkNew' 类型不兼容
  4. 参数类型不匹配:'vtkProp*' 和 'vtkNew' 类型不兼容
  5. Class 'Ui_RenderWindowUISingleInheritance' 没有字段 'qvtkWidget'
  6. Class 'Ui_RenderWindowUISingleInheritance' 没有字段 'actionExit'
  7. 无法解析变量 'qApp'

我希望有人能帮助我,因为我想进入 VTK 和 Qt,这似乎是我开始使用它们之前的最后挑战之一。即使您只能帮助其中的一小部分,也请告诉我,因为每一步都可能帮助我自己解决其余部分!

提前致谢

我在我的环境中构建了这个示例。要编译,您需要更正文件 RenderWindowUISingleInheritance.cxx.get() 放入这些对象 SetRenderWindow(renderWindow.Get()), SetMapper(sphereMapper.Get()), AddActor(sphereActor.Get()) 和 AddRenderer(renderer.Get()):

#include "RenderWindowUISingleInheritance.h"

// This is included here because it is forward declared in
// RenderWindowUISingleInheritance.h
#include "ui_RenderWindowUISingleInheritance.h"

#include <vtkGenericOpenGLRenderWindow.h>
#include <vtkNew.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkSphereSource.h>

// Constructor
RenderWindowUISingleInheritance::RenderWindowUISingleInheritance()
{
  this->ui = new Ui_RenderWindowUISingleInheritance;
  this->ui->setupUi(this);

  vtkNew<vtkGenericOpenGLRenderWindow> renderWindow;
  this->ui->qvtkWidget->SetRenderWindow(renderWindow.Get());


  // Sphere
  vtkNew<vtkSphereSource> sphereSource;
  sphereSource->Update();
  vtkNew<vtkPolyDataMapper> sphereMapper;
  sphereMapper->SetInputConnection(sphereSource->GetOutputPort());
  vtkNew<vtkActor> sphereActor;
  sphereActor->SetMapper(sphereMapper.Get());

  // VTK Renderer
  vtkNew<vtkRenderer> renderer;
  renderer->AddActor(sphereActor.Get());

  // VTK/Qt wedded
  this->ui->qvtkWidget->GetRenderWindow()->AddRenderer(renderer.Get());

  // Set up action signals and slots
  connect(this->ui->actionExit, SIGNAL(triggered()), this, SLOT(slotExit()));

}

void RenderWindowUISingleInheritance::slotExit()
{
  qApp->exit();
}