VTK系列教程八:控件Widget

前面我们已经实现了图像的显示和交互,今天我们来为MedBeyond添加一些控件,控件一般起到指示作用,能提供一些额外的信息。

在MedBeyond工作站中需要添加的控件:
边框控件
图像方向信息控件R、L、H、P
窗宽窗位信息控件
相机方向信息控件
VTK系列教程八:控件Widget
包围盒控件
VTK系列教程八:控件Widget
这些控件我们都可以用VTK中提供的基础元素像搭积木那样搭建出来,但强烈建议在要添加一个控件之前,看看VTK中是否已经有现成的,别重复造*,在Interaction\Widgets下面有很多控件,基本能满足绝大多数需求,下面分别看一下MedBeyond工作站中用到的控件如何实现:

边框控件:
如果我们是采用单个RenderWindow多个Renderer的方式,每个Renderer就是一个ViewPort,ViewPort中并没有提供边框,为了美观,需要手动添加,在VTK中有vtkBorderWidget控件,调用SetCurrentRenderer函数向ViewPort添加边框。

图像方向信息控件R、L、H、P:
在VTK中没有找到现成的,手动添加四个vtkTextActor。

窗宽窗位信息控件:
在VTK中有个vtkCornerAnnotation类,不仅可以显示窗宽窗位,还可以显示图像Number、某个点的像素值,并且可以自定义位置,我们称之为四角信息控件。

相机方向信息控件:
在VTK中有个vtkOrientationMarkerWidget控件能实现相机方向信息。

包围盒控件:
在VTK中有个vtkBoxWidget控件能实现相机方向信息。

注意:所有控件都需要调用SetCurrentRenderer,相当于设置父子关系,这样后续设置控件的位置大小时也是基于父Render进行的。

所有控件的基类都是vtkInteractorObserver,可见控件不仅可以响应鼠标操作,而且还能支持回调,也就是当操作控件时,我们可以获取控件状态变化信息,进而实现多个控件之间、图像与控件之间的联动。
VTK系列教程八:控件Widget
例如在包围盒控件中,我们可以通过下面方式添加回调函数:this->m_boxwidget->AddObserver(vtkCommand::InteractionEvent, this->m_boxcallback);当缩放包围盒时可以实现VR图像的裁切。

上一篇:shiro源码(三)-认证过滤器原理


下一篇:用 Flutter 和 Firebase 轻松构建 Web 应用,秀出天际