为什么在访问 vtkRenderWindow 的"交互器"变量时会发生段错误?



我有一个在 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();

奇怪的是,如果我创建一个新的渲染窗口,程序不会崩溃,如下所示,尽管testqVTK1->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);

这解决了交互器的问题。

最新更新