CommandCallbackBase.h
/// @file CommandCallbackBase.h
/// @brief vtk widget消息监听接口
/// @author project4gogo@163.com
/// @date 2018
#ifndef COMMANDCALLBACKBASE_H
#define COMMANDCALLBACKBASE_H
class vtkCallbackCommand;
class vtkObject;
/// 统一vtk widget消息的监听及消息接收
///
/// 子类只需继承这个类,并调用相应的接口,就可实现对widget消息的监听
class CommandCallbackBase
{
public:
CommandCallbackBase();
~CommandCallbackBase();
protected: //vtkWidget消息
/// 对VtkObject对象增加监听消息
/// @param pVtkObject 监听的对象
/// @param vtkCommandEvent 监听的消息
/// @param priority 消息的优先级
/// @return 无
virtual void AddVtkObjectObserver(vtkObject *pVtkObject, int vtkCommandEvent, double priority = 0.5);
/// 移除VtkObject对象监听消息
/// @param pVtkObject 监听的对象
/// @param vtkCommandEvent 监听的消息
/// @return 无
virtual void RemoveVtkObjectObserver(vtkObject *pVtkObject, int vtkCommandEvent);
/// VtkObject监听消息的处理
/// @param object 监听的对象
/// @param event 监听的消息
/// @param calldata 调用InvokeEvent (unsigned long event, void *callData)发出消息中的callData
/// @return 无
virtual void OnWidgetEvents(vtkObject* object, unsigned long event, void* calldata);
///设置是否截断消息传递
/// @param abort true:截断消息传递 false:继续消息传递
virtual void SetAbortFlag(bool abort);
/// VtkObject监听消息的静态处理入口
/// @param object 监听的对象
/// @param event 监听的消息
/// @param clientdata 消息的持有者指针,参考vtkCallbackCommand的方法SetClientData
/// @param calldata 调用InvokeEvent (unsigned long event, void *callData)发出消息中的callData
/// @return 无
static void ProcessEvents(vtkObject* object, unsigned long event, void* clientdata, void* calldata);
protected:
vtkCallbackCommand *m_pCallbackCommand = nullptr;
};
#endif // COMMANDCALLBACKBASE_H
CommandCallbackBase.cpp
#include "commandcallbackbase.h"
//qt
#include <qglobal.h>
//vtk
#include "vtkCallbackCommand.h"
#include "vtkObject.h"
//vtkStandardNewMacro(CommandCallbackBase);
CommandCallbackBase::CommandCallbackBase()
{
m_pCallbackCommand = vtkCallbackCommand::New();
m_pCallbackCommand->SetClientData(this);
m_pCallbackCommand->SetCallback(CommandCallbackBase::ProcessEvents);
}
CommandCallbackBase::~CommandCallbackBase()
{
//VTK_DELETE(m_pCallbackCommand);
if(nullptr != m_pCallbackCommand)
{
m_pCallbackCommand->Delete();
}
}
void CommandCallbackBase::AddVtkObjectObserver(vtkObject *pVtkObject, int vtkCommandEvent, double priority)
{
if(nullptr != pVtkObject)
{
if(0 == pVtkObject->HasObserver(vtkCommandEvent, m_pCallbackCommand))
{
pVtkObject->AddObserver(vtkCommandEvent, m_pCallbackCommand, priority);
}
}
}
void CommandCallbackBase::RemoveVtkObjectObserver(vtkObject *pVtkObject, int vtkCommandEvent)
{
if(nullptr != pVtkObject)
{
if(1 == pVtkObject->HasObserver(vtkCommandEvent, m_pCallbackCommand))
{
pVtkObject->RemoveObserver(vtkCommandEvent);
}
}
}
void CommandCallbackBase::OnWidgetEvents(vtkObject *object, unsigned long event, void *calldata)
{
Q_UNUSED(object);
Q_UNUSED(event);
Q_UNUSED(calldata);
}
void CommandCallbackBase::SetAbortFlag(bool abort)
{
if(true == abort)
{
m_pCallbackCommand->SetAbortFlag(1);
}
}
void CommandCallbackBase::ProcessEvents(vtkObject *object, unsigned long event, void *clientdata, void *calldata)
{
CommandCallbackBase* pSelf = reinterpret_cast<CommandCallbackBase *>( clientdata );
if(nullptr != pSelf )
{
pSelf->OnWidgetEvents(object, event, calldata);
}
}