使用QVTKRenderWindowInteractor

时间:2018-03-12 19:40:32

标签: python pyqt5 vtk

我正在尝试学习vtk和pyqt。出于这个原因,我通过以下两个例子并在python中实现了第一个例子。

ReadDICOMSeries

EmbedPyQt

然而,当我试图在QMainWindow中实现DICOM系列时,我遇到了一个问题。虽然我没有得到任何错误,但没有任何错误。

我厌倦了实现查看器的不同方式,但这是我最后一次没有交互的简化版本。

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


def main():
    app = QApplication(sys.argv)

    # creat window
    main_window = QMainWindow()
    iwidget = QVTKRenderWindowInteractor(main_window)
    main_window.setCentralWidget(iwidget)

    # set up dicom reader
    reader = vtk.vtkDICOMImageReader()
    reader.SetDirectoryName('digest_article')
    reader.Update()

    # initialize renderer
    renderer = vtk.vtkRenderer()

    # set up mapper
    slice_mapper = vtk.vtkImageSliceMapper()
    slice_mapper.SetInputConnection(reader.GetOutputPort())

    # set random slice number
    slice_mapper.SetSliceNumber(5)

    # get render window from QVTKRenderWindowInteractor
    render_window = iwidget.GetRenderWindow()

    # add renderer to render window
    render_window.AddRenderer(renderer)

    # set up image_slice
    image_slice = vtk.vtkImageSlice()
    image_slice.SetMapper(slice_mapper)

    # set up window and level of image_slice
    MinMax = reader.GetOutput().GetScalarRange()

    image_slice_property = image_slice.GetProperty()
    image_slice_property.SetColorWindow(MinMax[1])
    image_slice_property.SetColorLevel((MinMax[1] - MinMax[0]) / 2)
    image_slice.Update()

    # set image_slice as input for renderer
    renderer.AddViewProp(image_slice)

    # show window
    main_window.show()

    render_window.Render()
    renderer.ResetCamera()
    render_window.Render()


    app.exec_()


if __name__ == '__main__':
    main()

上述功能会导致输出结束。

Resulting Window

由于没有错误,我怀疑我错误地初始化了渲染,或者我错过了什么。

你认为问题出在初始化上吗?

如何在vtk中初始化渲染,特别是关于上面的例子?

我也很感激其他理论。

1 个答案:

答案 0 :(得分:0)

我认为您应该创建渲染窗口交互器。 尝试:

iren = render_window.GetInteractor()

然后在最后初始化交互器

iren.Initialize()