Я использую VTK в своем проекте. Теперь я хочу удалить всех наблюдателей и реализовать самого себя. Но RemoveAllObservers
не работает. Мой код:
from PyQt5.QtWidgets import *
import sys, os
import vtk
from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
def mouseMoveEvent(iren, event):
print('move')
class MyWin(QWidget):
def __init__(self):
super().__init__()
layout = QVBoxLayout()
self.setLayout(layout)
self.vtkWidget = QVTKRenderWindowInteractor()
layout.addWidget(self.vtkWidget)
self.ren = vtk.vtkRenderer()
self.vtkWidget.GetRenderWindow().AddRenderer(self.ren)
interactor = self.vtkWidget.GetRenderWindow().GetInteractor()
interactor.Initialize()
interactor.RemoveAllObservers()
interactor.AddObserver('MouseMoveEvent', mouseMoveEvent)
interactor.Start()
self.imageViewer = vtk.vtkImageViewer2()
self.imageViewer.SetupInteractor(interactor)
self.imageViewer.SetRenderWindow(self.vtkWidget.GetRenderWindow())
img = vtk.vtkDICOMImageReader()
img.SetFileName('C:\\Users\\MLoong\\Desktop\\dicom_data\\Chang Cheng\\TOF\\IM_0174')
img.Update()
self.imageViewer.SetInputData(img.GetOutput())
self.imageViewer.Render()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyWin()
window.show()
app.exec_()
Даже если я удаляю всех наблюдателей с помощью interactor.RemoveAllObservers()
, изображение все равно можно увеличивать/уменьшать правой кнопкой мыши.
Как убрать всех наблюдателей?
Проблема в порядке вашей установки.
imageViewer.SetupInteractor()
воссоздать некоторых наблюдателей по умолчанию. Поэтому вы должны удалить/создать наблюдателя после.
interactor = self.vtkWidget.GetRenderWindow().GetInteractor()
self.imageViewer = vtk.vtkImageViewer2()
self.imageViewer.SetupInteractor(interactor)
self.imageViewer.SetRenderWindow(self.vtkWidget.GetRenderWindow())
# img = vtk.vtkDICOMImageReader()
# img.SetFileName('C:\\Users\\MLoong\\Desktop\\dicom_data\\Chang Cheng\\TOF\\IM_0174')
# using a source for testing
img = vtk.vtkRTAnalyticSource()
img.Update()
self.imageViewer.SetInputData(img.GetOutput())
self.imageViewer.Render()
interactor.RemoveAllObservers()
interactor.AddObserver('MouseMoveEvent', mouseMoveEvent)
interactor.Initialize()
interactor.Start()
RemoveAllObservers()
должен работать, но как только вы вызываете SetupInteractor
, выполняется внутренняя инициализация, и некоторые наблюдатели снова устанавливаются на ваш интерактор.
Спасибо за ваш любезный ответ. Однако мне нужно сначала создать интерактивный наблюдатель, а затем (нажать кнопку) создать средство просмотра изображений. Итак, есть ли способ
RemoveAllObservers
доimageViewer.SetupInteractor(interactor)
?