Vtk: как удалить всех наблюдателей

Я использую 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(), изображение все равно можно увеличивать/уменьшать правой кнопкой мыши. Как убрать всех наблюдателей?

Интерактивное приложение ChatGPT GUI
Интерактивное приложение ChatGPT GUI
Мотивацией для этой статьи послужила моя лень набирать слишком много текста для запроса в чат GPT. Таким образом, мне пришла в голову идея, почему бы...
0
0
447
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в порядке вашей установки.

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 до imageViewer.SetupInteractor(interactor)?

Qiang Zhang 11.12.2020 12:50
RemoveAllObservers() должен работать, но как только вы вызываете SetupInteractor, выполняется внутренняя инициализация, и некоторые наблюдатели снова устанавливаются на ваш интерактор.
Nico Vuaille 14.12.2020 09:32

Другие вопросы по теме