vtkRenderWindow segfault when accessing Interactor variable

Hi everyone,

Not sure if this is the correct venue, so please forgive my inexperience.

I have an application that uses VTK with QT, on Ubuntu 20.04 LTS. It compiles just fine and most of the application works. However, when I try to create a vtkRenderWindow, it crashes with a segfault. Specifically, whenever my application tries to access or interact with the vtkRenderWindow object’s Interactor variable (declared in vtkRenderWindow.h:754).

  vtkRenderWindowInteractor* Interactor;

Thus far, I’ve had it crashing with (1) vtkRenderWindow::GetInteractor(), (2) vtkRenderWindow::SetInteractor(), and (3) vtkRenderWindow::MakeRenderWindowInteractor().

(1) To be more precise, the program crashes the moment it attempts to call vtkRenderWindow::GetInteractor(). The code in question:

    vtkRenderer* m_Ren1;
    vtkRenderWindow* renwin;
    QVTKOpenGLStereoWidget* qVTK1;

    m_Ren1 = vtkRenderer::New();
    renwin = vtkRenderWindow::New();
    renwin->AddRenderer(m_Ren1);
    ui->qVTK1->setRenderWindow(renwin);

    ui->qVTK1->renderWindow()->GetInteractor();

(2) When calling vtkRenderWindow::SetInteractor(), it crashes at vtkRenderWindow.cxx:155, at the line
if (this->Interactor != rwi). I show the code I use below:

    vtkRenderer* m_Ren1;
    vtkRenderWindow* renwin;
    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) When calling vtkRenderWindow::MakeRenderWindowInteractor(), it crashes at vtkObjectFactory.cxx:438, specifically when it calls the strcmp function.

if (this->OverrideArray[i].EnabledFlag &&
      strcmp(this->OverrideClassNames[i], vtkclassname) == 0)

Again, I show the code I use to test this below:

    vtkRenderer* m_Ren1;
    vtkRenderWindow* renwin;
    QVTKOpenGLStereoWidget* qVTK1;

    m_Ren1 = vtkRenderer::New();
    renwin = vtkRenderWindow::New();
    renwin->AddRenderer(m_Ren1);
    ui->qVTK1->setRenderWindow(renwin);
    ui->qVTK1->renderWindow()->MakeRenderWindowInteractor();

Curiously, the program does not crash if I create a new RenderWindow as below, despite both test and qVTK1->renderWindow() being of type vtkXOpenGLRenderWindow. It does crash regardless of if I set qVTK1->renderWindow()'s interactor to t1 or 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);

Again, please forgive my inexperience. If anyone has any idea why this occurs or how to deal with it, I would very much appreciate it.

Thanks!

Solved! The problem actually came about from the QT side. QVTKOpenGLRenderWindow cannot deal with vtkXOpenGLRenderWindow, it requires vtkGenericOpenGLRenderWindow. But vtkGenericOpenGLRenderWindow cannot be created with vtkRenderWindow::New(). The solution is to declare the renderwindow in a different way:

    vtkRenderer* m_Ren1;
    vtkRenderWindow* renwin;
    QVTKOpenGLStereoWidget* qVTK1;

    m_Ren1 = vtkRenderer::New();```
    vtkNew<vtkGenericOpenGLRenderWindow> rw;
    renwin = rw;```
    renwin->AddRenderer(m_Ren1);
    ui->qVTK1->setRenderWindow(renwin);

This solves the problem with the interactor.