VTK QT vtkCallbackCommand封装

12 篇文章 2 订阅

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值