处理vtk鼠标事件从实现方式上看有两种方式:
1.通过继承vtk的interactorstyle父类,实现virtual类来达到目的
代码示例:
1. `//实现interactorstyle类` 2. `class MyVtkInteractorStyle : public vtkInteractorStyleTrackballCamera` 3. `{` 4. `public:` 5. ` static MyVtkInteractorStyle *New();` 6. ` vtkTypeMacro(MyVtkInteractorStyle, vtkInteractorStyleTrackballCamera);` 7. ` ...` 8. ` virtual void OnMouseMove();` 9. ` virtual void OnLeftButtonDown();` 10. ` virtual void OnLeftButtonUp();` 11. ` ...` 12. `};`
1. `//使用该交互器方式 ` 2. ` ... ` 3. `vtkSmartPointer<MyVtkInteractorStyle> style =` 4. ` vtkSmartPointer<MyVtkInteractorStyle>::New();` 5. 6. renderWindowInteractor->SetInteractorStyle(style); 7. ...
2.通过自有交互器方式绑定callback。此处又分为绑定vtkCommand子类和callback function,只介绍绑定子类的实现,两者基本相同
代码示例:
1. `class vtkImageInteractionCallback : public vtkCommand` 2. `{` 3. `public:` 4. ` static vtkImageInteractionCallback *New();` 5. ` ...` 6. ` virtual void Execute(vtkObject *caller, unsigned long eventId,void *callData)` 7. ` {` 8. ` switch(eventId)` 9. ` {` 10. case(vtkCommand::LeftButtonPressEvent): 11. ` {//通过switch处理` 12. ` cout << "catch left button down in callback"<<endl;` 13. ` break;` 14. ` }` 15. } 16. ... 17. `};`
1. `//通过监视`vtkCommand::MouseMoveEvent等事件调用回调函数 2. ` ` 3. `vtkSmartPointer<vtkImageInteractionCallback> callback =` 4. ` vtkSmartPointer<vtkImageInteractionCallback>::New();` 5.6. ` vtkSmartPointer<MyVtkInteractorStyle> style =` 7. ` vtkSmartPointer<MyVtkInteractorStyle>::New();` 8. ` style->AddObserver(vtkCommand::MouseMoveEvent, callback);` 9. ` style->AddObserver(vtkCommand::LeftButtonPressEvent, callback);` 10.
我试着将自己实现的interactorstyle类绑定callback类,同时处理鼠标左击事件,会发生什么呢?
逻辑上讲应该是先interactor检测到事件发生,再调用callback。也就是说先有1中的发生,后有2中的发生。
实际情况是只有2中的方式被调用了。
</div></div></div></div>
[来自为知笔记(Wiz)](http://www.wiz.cn/i/c09d0bb5 "来自为知笔记(Wiz)")