vtkInteractorStyleImage do not work in QVTKWidget

I find vtkInteractorStyleImage do not work in QVTKWidget.

For example, the following code:

import vtk
from vtk.util.numpy_support import vtk_to_numpy, numpy_to_vtk
import numpy as np

def numpyToVTK(data):
    if len(data.shape) == 2:
        data = data[:, :, np.newaxis]
    flat_data_array = data.transpose(2,1,0).flatten()
    vtk_data = numpy_to_vtk(num_array=flat_data_array, deep=True, array_type=vtk.VTK_FLOAT)
    shape = data.shape

    img = vtk.vtkImageData()
    img.GetPointData().SetScalars(vtk_data)
    img.SetDimensions(shape[0], shape[1], shape[2])
    return img

img = np.zeros(shape=[512, 512])

img[0:256, 0:256] = 0
img[0:256, 256:] = 64
img[256:, 0:256] = 128
img[256:, 256:] = 256

img = numpyToVTK(img)

imgActor = vtk.vtkImageActor()
imgActor.SetInputData(img)


renderer = vtk.vtkRenderer()
renderer.AddActor(imgActor)
renderer.SetBackground(0.4, 0.5, 0.6)

renderWindow = vtk.vtkRenderWindow()
renderWindow.AddRenderer(renderer)
renderWindow.Render()
renderWindowInteractor = vtk.vtkRenderWindowInteractor()
style = vtk.vtkInteractorStyleImage()
renderWindowInteractor.SetInteractorStyle(style)
renderWindowInteractor.SetRenderWindow(renderWindow)
renderWindowInteractor.Initialize()
renderWindowInteractor.Start()

I can’t rotate the image, because the vtkInteractorStyleImage is used.

But, if I want to use vtkInteractorStyleImage in QVTKWidget, for example:

import vtk
from vtk.util.numpy_support import vtk_to_numpy, numpy_to_vtk
import numpy as np

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import sys
from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor


def numpyToVTK(data):
    if len(data.shape) == 2:
        data = data[:, :, np.newaxis]
    flat_data_array = data.transpose(2,1,0).flatten()
    vtk_data = numpy_to_vtk(num_array=flat_data_array, deep=True, array_type=vtk.VTK_FLOAT)
    shape = data.shape

    img = vtk.vtkImageData()
    img.GetPointData().SetScalars(vtk_data)
    img.SetDimensions(shape[0], shape[1], shape[2])
    return img

img = np.zeros(shape=[512, 512])

img[0:256, 0:256] = 0
img[0:256, 256:] = 64
img[256:, 0:256] = 128
img[256:, 256:] = 256

img = numpyToVTK(img)

class Widget(QWidget):

    def __init__(self):
        super().__init__()

        layout = QVBoxLayout()
        self.setLayout(layout)
        self.vtkWidget = QVTKRenderWindowInteractor()
        layout.addWidget(self.vtkWidget)

        imgActor = vtk.vtkImageActor()
        imgActor.SetInputData(img)

        renderer = vtk.vtkRenderer()
        renderer.AddActor(imgActor)
        renderer.SetBackground(0.4, 0.5, 0.6)

        renderWindow = self.vtkWidget.GetRenderWindow()
        renderWindow.AddRenderer(renderer)
        renderWindow.Render()
        renderWindowInteractor = vtk.vtkRenderWindowInteractor()
        style = vtk.vtkInteractorStyleImage()
        renderWindowInteractor.SetInteractorStyle(style)
        renderWindowInteractor.SetRenderWindow(renderWindow)
        renderWindowInteractor.Initialize()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    win = Widget()
    win.show()
    app.exec_()

I find I can rotate the image in the QVTKWidget even the vtkInteractorStyleImage is used.

My environment is:

python 3.7
vtk 9.0.3
win 10

How can I apply vtkInteractorStyleImage in QVTKWidget?

Replace this:

        renderWindowInteractor = vtk.vtkRenderWindowInteractor()
        style = vtk.vtkInteractorStyleImage()
        renderWindowInteractor.SetInteractorStyle(style)
        renderWindowInteractor.SetRenderWindow(renderWindow)
        renderWindowInteractor.Initialize()

with this:

        style = vtk.vtkInteractorStyleImage()
        self.vtkWidget.SetInteractorStyle(style)

The QVTKRenderWindowInteractor acts as a vtkRenderWindowInteractor (to be more specific, it uses a vtkGenericRenderWindowInteractor that processes Qt events).

That is why the class is called “QVTKRenderWindowInteractor”: it is a vtkRenderWindowInteractor (via duck typing), and it is also a Qt widget.

1 Like

Thank you very much, It is work.