问题描述:
公司基于MITK开发的项目,在测试中出现了一个问题,创建病例时,加载Dicom影像后使用滚轮滚动浏览Dicom时,滚轮滚动一下,Dicom翻了两页。
问题定位过程:
在Debug下对问题进行定位分析,鼠标的滚轮事件根据交互配置文件DisplayInteraction.xml可知对应用的Acttion为ScrollOneUp、ScrollOneDown,在事件处理类DisplayActionEventBroadcast中可找到对应的同名处理函数:
在ScrollOneDown函数中打上断点,进行调试,发现滚动一下时只触发了一次该 函数的调用。
继续向下追踪,MITK的事件统一由mitk::Dispatcher::ProcessEvent(InteractionEvent *event)处理,在该函数内单步调试发现该事件有两个观察者,并发出两次通知:
导致SliceNavigationController类的SendSlice被调起了两次,从而表现为修改了两次当前位置。
结合项目实现发现,这是由于项目创建病例时为了方便多序列对比启动了mxnmultiwidgetEditor,而在项目中启用该Editor时没有关闭stdmultiwidgetEditor,导致同时注册了两个观察都导致。使用原版MITK应用验证该问题,打开MITK后导入DICOM后,同时打开standard Display和MxN Display, 滚动鼠标滚轮后,DICOM一次翻动两页。
解决方法:
知道了原因后,解决方法就很简单了,使用一个Editor时,使用CloseEditor()函数关闭另一个即可。示例代码如下: