vtkResliceImageViewer block mouse events

I want to overwrite the behavior of the default interactor style of vtkResliceImageViewer. I add some observers, and it works. But when I add a imagedata to vtkResliceImageViewer, all my observers won’t triggered.

I tried to remove all observers then add my observers, but it didn’t work.
I’m still confused about what’s the difference between Interactor and InteractorStyle, and what’s the observer process order if observers are added to both.

Below is my test code, widget.set_volume(image_data) will block all my observers:

import sys
import typing
from qtpy import QtWidgets, QtGui, QtCore
import numpy as np
import vtk
from vtkmodules.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor


class VolumeSliceWidget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)

        self._init_vtk()
        self._add_vtk_callback()

        vl = QtWidgets.QVBoxLayout()
        vl.addWidget(self.vtk_widget)
        self.setLayout(vl)

    def _init_vtk(self):
        self._frame = QtWidgets.QFrame()
        self._ren = vtk.vtkRenderer()
        self._style = vtk.vtkInteractorStyleImage()
        self._border_widget = vtk.vtkBorderWidget()

        self.vtk_widget = QVTKRenderWindowInteractor(self._frame)
        self.vtk_widget.GetRenderWindow().AddRenderer(self._ren)
        self.vtk_widget.GetRenderWindow().GetInteractor().SetInteractorStyle(
            self._style
        )
        self._interactor = self.vtk_widget.GetRenderWindow().GetInteractor()
        self._interactor.Initialize()

        # self.viewer.SetRenderer(self._ren)
        self.viewer = vtk.vtkResliceImageViewer()
        self.viewer.GetResliceCursorWidget().SetInteractor(self._interactor)
        self.viewer.GetMeasurements().ProcessEventsOff()
        self.viewer.GetResliceCursorWidget().EnabledOn()
        self.viewer.SetResliceModeToOblique()
        rep = (
            self.viewer.GetResliceCursorWidget()
            .GetRepresentation()
            .GetResliceCursorActor()
        )
        # see https://gitlab.kitware.com/vtk/vtk/-/issues/18441
        rep.GetCenterlineProperty(0).SetRepresentationToWireframe()
        rep.GetCenterlineProperty(1).SetRepresentationToWireframe()
        rep.GetCenterlineProperty(2).SetRepresentationToWireframe()

        self._picker = vtk.vtkPropPicker()
        self._picker.PickFromListOn()
        self._picker.AddPickList(self.viewer.GetImageActor())

        self._ren.ResetCamera()

    def _add_vtk_callback(self):
        self._style.AddObserver(
            vtk.vtkCommand.StartWindowLevelEvent,
            lambda c, ev: print("start window level"),
        )
        # self._style.AddObserver(
        #     vtk.vtkCommand.InteractionEvent, lambda c, ev: print("window level")
        # )
        self._style.AddObserver(
            vtk.vtkCommand.EndWindowLevelEvent,
            lambda c, ev: print("end window level"),
            1,
        )
        self._style.AddObserver(
            vtk.vtkCommand.ResetWindowLevelEvent,
            lambda c, ev: print("reset window level"),
        )
        self._style.AddObserver(
            vtk.vtkCommand.LeftButtonPressEvent,
            lambda c, ev: print("left button pressed"),
        )

        self._style.AddObserver(
            vtk.vtkCommand.LeftButtonReleaseEvent,
            lambda c, ev: print("left button released"),
        )

    def set_volume(self, volume):
        self._image_data = volume

        orientation = self.viewer.GetSliceOrientation()
        dims = self._image_data.GetDimensions()

        self.viewer.SetupInteractor(self._interactor)
        self.viewer.SetRenderWindow(self.vtk_widget.GetRenderWindow())

        self.viewer.SetInputData(self._image_data)
        self.viewer.SetSlice(dims[orientation] // 2)
        self.viewer.GetResliceCursor().Reset()
        self.viewer.GetRenderer().ResetCamera()
        self.viewer.Render()
        # print(self.viewer)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    widget = VolumeSliceWidget()

    filename = "buck_28_128x128x128_uint8.raw"
    size = 128
    volume = np.fromfile(filename, offset=28, dtype=np.uint8).reshape(
        (size, size, size)
    )

    data_array_view = vtk.vtkUnsignedCharArray()
    data_array_view.SetVoidArray(volume.ravel(), volume.size, 1)
    data_array_view.SetNumberOfComponents(1)

    image_data = vtk.vtkImageData()
    image_data.GetPointData().SetScalars(data_array_view)
    image_data.SetDimensions(volume.shape[2], volume.shape[1], volume.shape[0])

    # widget.set_volume(image_data)  # <-- this line will block all my observers
    widget.show()

    sys.exit(app.exec_())