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();	

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回调函数用于处理交互事件,以绘制焦点框。在上述的示例代码中,回调函数使用lambda表达式的方式定义,方便起见。 在vtkCommand::LeftButtonPressEvent事件回调函数中,我们可以获取鼠标点击位置(clickPos)和被点击渲染器(clickedRenderer)。然后,我们将被点击渲染器设置为焦点框的默认渲染器,从而在被点击的渲染器中绘制焦点框。 以下是回调函数具体实现的示例代码: ```cpp // 在交互器中添加vtkCommand::LeftButtonPressEvent事件来绘制焦点框 interactor->AddObserver(vtkCommand::LeftButtonPressEvent, [&](vtkObject*, unsigned long, void*, void*) { int* clickPos = interactor->GetEventPosition(); vtkRenderer* clickedRenderer = interactor->FindPokedRenderer(clickPos[0], clickPos[1]); // 在点击的渲染器中绘制焦点框 if (clickedRenderer != nullptr) { borderWidget->SetDefaultRenderer(clickedRenderer); renderWindow->Render(); // 重新渲染窗口,以显示焦点框 } }); ``` 在这个示例中,我们首先获取鼠标点击位置(clickPos),然后使用interactor的FindPokedRenderer方法获取被点击的渲染器(clickedRenderer)。 如果被点击的渲染器不为空,则将其设置为焦点框的默认渲染器(borderWidget->SetDefaultRenderer(clickedRenderer))。最后,我们调用renderWindowRender方法,重新渲染窗口以显示焦点框。 您可以根据实际需求对回调函数进行修改和扩展,以实现适合您的应用场景的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值