VTK鼠标键盘事件

VTK鼠标键盘事件会优先于QT的鼠标键盘事件,而且会吃掉这些事件,使得QT的

    //void mouseMoveEvent(QMouseEvent * event) override;
这种事件得不到执行。

这主要是通过QVTKOpenGLWidget类来实现的。

所以我们只能使用VTK的鼠标响应机制来实现鼠标键盘的控制。

 

VTK鼠标键盘事件的响应是用观察者模式,也就是先注册观察者。等事件发生的时候,自动回调观察者的成员函数。

第一步,创建观察者类,实现回调函数

#pragma once

#include "vtkCommand.h"
#include "SeriesPreviewWindow.h"

class SeriesPreviewWindowCallback : public vtkCommand
{
public:
	static SeriesPreviewWindowCallback* New()
	{
		return new SeriesPreviewWindowCallback;
	}
	SeriesPreviewWindowCallback();
	~SeriesPreviewWindowCallback();
	void Execute(vtkObject *caller, unsigned long eventId, void *callData) override;
	void SetParentWindow(SeriesPreviewWindow* window);	

protected:
	SeriesPreviewWindow * m_seriesPreviewWindow;
};

第二步,实现回调函数

void SeriesPreviewWindowCallback::Execute(vtkObject *caller, unsigned long eventId, void *callData)
{
	switch (eventId)
	{
	case vtkCommand::LeftButtonPressEvent:
	{
		***::Instance()->SetMovingSeriesWindow(m_seriesPreviewWindow);
		break;
	}
	case vtkCommand::MouseMoveEvent:
	{

第三步,在窗口对象初始化的时候注册回调对象

vtkNew callback;//会自动释放
callback->SetParentWindow(this);	
interactor->AddObserver(vtkCommand::LeftButtonPressEvent, callback, 5.5);//左键按下选中当前序列缩略图子窗口
interactor->AddObserver(vtkCommand::MouseMoveEvent, callback, 5.5);//左键按下选中当前序列缩略图子窗口

 

你可能感兴趣的:(VTK/ITK)