之前在 VTK交互 使用交互样式和添加监听事件两种方式拓展VTK交互。最近接触了VTK用来完成交互的widget 。因为提供了实体部件会使得交互更加人性化。VTK的Widget类是从VTk5.1之后重新设计完善。实现了交互和实体表达的分离。创建VTK widget需要完成如下步骤:
1 实例化widget
2 实例化合适的几何表达体
3 可以用添加监听事件方式为widge添加交互,(每个widget组件以有默认的事件及处理方法)
4最后必须激活部件 否则部件就不会显示在窗口
在widget有自己的widget事件(vtkWidgetEvent.h)。这里列出部分widget事件 如下:
NoEvent | |
Select | |
EndSelect | |
Delete | |
Translate | |
EndTranslate | |
Scale | |
EndScale | |
Resize |
VTKEvent和WidgetEvent之间的转换要用到vtkWidgetEventTranslator类。该类可以通过GetEventTranslator函数获取。
vtkWidgetEventTranslator类中有两个重要的函数:
void SetTranslation (unsigned long VTKEvent, int modifier, char keyCode, int repeatCount, const char *keySym, unsigned long widgetEvent) int RemoveTranslation (unsigned long VTKEvent, int modifier, char keyCode, int repeatCount, char *keySym)
1、删除VTK事件和widgwt事件对应关系 这样widget事件就不会被监听。
2、更改vtk事件和widget事件的对应关系 比如:VTKEvent::LeftbuttionPressEvent对应WidgetWvwnt::Select 可以被更改为VTKEvent::KeyPressEvent对应WidgetWvwnt::Select
widgetEvent事件的处理函数都是受保护静态函数。里面都已经实现了对应的处理。一般部件内部已经通过vtkWidgetCallbackMapper将WidgetEvent与处理函数关联起来
例如: Select -------SelectAction();
Delete -------DeleteAction();
widget->AddObserver(vtkCommand::InteractionEvent ,seedCallback);使用该函数为部件添加新的事件及回调函数。