vtk如何实现事件回调、交互的创建

事件回调:
创建回调事件类,继承vtkCommand

class vtkImageInteractionCallback : public vtkCommand
{
public:
	virtual void Execute(vtkObject *caller, unsigned long event, void *)
	{
		// 获取交互器
		vtkSmartPointer<vtkRenderWindowInteractor> interator = vtkRenderWindowInteractor::SafeDownCast(caller);
		// 获取交互样式
		vtkInteractorStyle *style = vtkInteractorStyle::SafeDownCast(interator->GetInteractorStyle());
		if (event == vtkCommand::LeftButtonPressEvent)
		{
		}
		else if (event == vtkCommand::LeftButtonReleaseEvent)
		{
		}
		else if (event == vtkCommand::MouseWheelBackwardEvent)
		{
			//style->OnMouseWheelBackward();
		}
		else if (event == vtkCommand::MouseWheelForwardEvent)
		{
			//style->OnMouseWheelForward();
		}

		if (event == vtkCommand::EndInteractionEvent)
		{
			//style->OnMouseWheelForward();
		}

	}
};

调用方式:
// 新建自定义交互类
vtkSmartPointer<vtkImageInteractionCallback> callback = vtkSmartPointer<vtkImageInteractionCallback>::New();
// 移除默认鼠标事件监听
ui->qvtkWidget->GetInteractor()->RemoveAllObservers();
 添加自定义鼠标交互事件监听
ui->qvtkWidget->GetInteractor()->AddObserver(vtkCommand::LeftButtonPressEvent, callback);
ui->qvtkWidget->GetInteractor()->AddObserver(vtkCommand::LeftButtonReleaseEvent, callback);
ui->qvtkWidget->GetInteractor()->AddObserver(vtkCommand::MouseWheelBackwardEvent, callback);
ui->qvtkWidget->GetInteractor()->AddObserver(vtkCommand::MouseWheelForwardEvent, callback);

交互方式:
创建交互事件类,继承对应的vtkInteractorStyle
类如:

//鼠标滚轮切换不同的dcm
class myVtkInteractorStyleImage : public vtkInteractorStyleImage
{
public:
	static myVtkInteractorStyleImage* New();
	vtkTypeMacro(myVtkInteractorStyleImage, vtkInteractorStyleImage);

protected:
	vtkImageViewer2* ImageViewer;
	int Slice;
	int MinSlice;
	int MaxSlice;

public:
	void SetImageViewer(vtkImageViewer2* imageViewer)
	{
		this->ImageViewer = imageViewer;
		this->MinSlice = imageViewer->GetSliceMin();
		this->MaxSlice = imageViewer->GetSliceMax();
		this->Slice = (this->MinSlice + this->MaxSlice) / 2;
		this->ImageViewer->SetSlice(this->Slice);
		this->ImageViewer->Render();
	}
protected:
	virtual void KeyPressEvent() {}
	virtual void KeyReleaseEvent() {}

	virtual void OnMouseWheelForward()
	{
		if (this->Slice < this->MaxSlice)
		{
			this->Slice += 1;
			this->ImageViewer->SetSlice(this->Slice);
			this->ImageViewer->Render();
		}
	}

	virtual void OnMouseWheelBackward()
	{
		if (this->Slice > this->MinSlice)
		{
			this->Slice -= 1;
			this->ImageViewer->SetSlice(this->Slice);
			this->ImageViewer->Render();
		}
	}
};
//该宏放在cpp文件中。
vtkStandardNewMacro(myVtkInteractorStyleImage);

//调用方式
	//添加交互
	vtkSmartPointer<myVtkInteractorStyleImage> style = vtkSmartPointer<myVtkInteractorStyleImage>::New();
	style->SetImageViewer(this->m_Viewer);
	interactor->SetInteractorStyle(style);
	this->m_Viewer->Render();	

你可能感兴趣的:(交互,VTK,c++)