CommandCallbackBase.h
/// @file CommandCallbackBase.h
/// @brief vtk widget消息監聽接口
/// @author [email protected]
/// @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);
}
}