我有一个在 Ubuntu 20.04 LTS 上使用 VTK 9.0 和 QT 5.14.2 的应用程序。它编译得很好(使用 gcc(,并且大多数应用程序都可以工作。但是,当我尝试创建vtkRenderWindow时,它崩溃并出现段错误。具体来说,每当我的应用程序尝试访问 vtkRenderWindow 对象的受保护Interactor
变量(在vtkRenderWindow.h:754
中声明(或与之交互时。
vtkRenderWindowInteractor* Interactor;
到目前为止,我已经用(1(vtkRenderWindow::GetInteractor()
、(2(vtkRenderWindow::SetInteractor()
和(3(vtkRenderWindow::MakeRenderWindowInteractor()
崩溃了。
(1(更准确地说,程序在尝试执行vtkRenderWindow::GetInteractor()
的那一刻崩溃。调用 VTK 函数的代码:
vtkRenderer* m_Ren1;
vtkRenderWindow* renwin;
Ui::vtkwindow_new *ui;
QVTKOpenGLStereoWidget* qVTK1;
m_Ren1 = vtkRenderer::New();
renwin = vtkRenderWindow::New();
renwin->AddRenderer(m_Ren1);
ui->qVTK1->setRenderWindow(renwin);
ui->qVTK1->renderWindow()->GetInteractor();
(2(调用vtkRenderWindow::SetInteractor()
时,它在vtkRenderWindow.cxx:155
、线路上崩溃if (this->Interactor != rwi)
.我在下面显示我使用的代码:
vtkRenderer* m_Ren1;
vtkRenderWindow* renwin;
Ui::vtkwindow_new *ui;
QVTKOpenGLStereoWidget* qVTK1;
m_Ren1 = vtkRenderer::New();
renwin = vtkRenderWindow::New();
renwin->AddRenderer(m_Ren1);
ui->qVTK1->setRenderWindow(renwin);
vtkRenderWindowInteractor* t1 = vtkRenderWindowInteractor::New();
ui->qVTK1->renderWindow()->SetInteractor(t1);
(3(当调用vtkRenderWindow::MakeRenderWindowInteractor()
时,它会在vtkObjectFactory.cxx:438
崩溃,特别是当它调用strcmp
函数时。
if (this->OverrideArray[i].EnabledFlag &&
strcmp(this->OverrideClassNames[i], vtkclassname) == 0)
同样,我在下面展示了我用来测试的代码:
vtkRenderer* m_Ren1;
vtkRenderWindow* renwin;
Ui::vtkwindow_new *ui;
QVTKOpenGLStereoWidget* qVTK1;
m_Ren1 = vtkRenderer::New();
renwin = vtkRenderWindow::New();
renwin->AddRenderer(m_Ren1);
ui->qVTK1->setRenderWindow(renwin);
ui->qVTK1->renderWindow()->MakeRenderWindowInteractor();
奇怪的是,如果我创建一个新的渲染窗口,程序不会崩溃,如下所示,尽管test
和qVTK1->renderWindow()
都是vtkXOpenGLRenderWindow
类型。无论我将qVTK1->renderWindow()
的交互器设置为t1
还是t2
,它都会崩溃:
vtkRenderWindow* test = vtkRenderWindow::New();
vtkRenderWindowInteractor* t2 = test->GetInteractor();
vtkRenderWindowInteractor* t1 = vtkRenderWindowInteractor::New();
test->SetInteractor(t1);
ui->qVTK1->renderWindow()->SetInteractor(t1);
ui->qVTK1->renderWindow()->SetInteractor(t2);
如果有人知道为什么会发生这种情况或如何处理它,我将不胜感激。我也在VTK论坛上问过,但一周后没有得到答复。我无法在任何地方找到类似的案例。鉴于所有崩溃都发生在 VTK 库代码中,我对导致它的原因感到非常困惑。
谢谢!
解决了!问题实际上来自QT方面。QVTKOpenGLRenderWindow
无法处理vtkXOpenGLRenderWindow
,它需要vtkGenericOpenGLRenderWindow
。但是vtkGenericOpenGLRenderWindow
不能用vtkRenderWindow::New()
创建。解决方案是声明包装在vtkNew<>
指针中的呈现窗口:
vtkRenderer* m_Ren1;
vtkRenderWindow* renwin;
QVTKOpenGLStereoWidget* qVTK1;
m_Ren1 = vtkRenderer::New();
vtkNew<vtkGenericOpenGLRenderWindow> rw;
renwin = rw;
renwin->AddRenderer(m_Ren1);
ui->qVTK1->setRenderWindow(renwin);
这解决了交互器的问题。