一个简单的回调例子

回调一般用于两个dll之间的调用,要调用不同dll的函数必须函数需要导出,即export.而回调给了一个地址过来就很方便。相当于底层调用上层函数。

callbackTopper.h

#ifndef CALLBACKTOPPER_H
#define CALLBACKTOPPER_H


//**************回调顶层*****************示例********************//
#include <QObject>
#include <QtDebug>
#include "callbackBottom.h"

class callbackTopper : public QObject
{
	Q_OBJECT

public:
	callbackTopper(QObject *parent = NULL);
	~callbackTopper();

	static void  RefreshNode_CB(void *lp,char* lc);
private:
	void outName(char* cha);
};

#endif // CALLBACKTOPPER_H

callbackTopper.cpp

#include "callbackTopper.h"

callbackTopper::callbackTopper(QObject *parent)
	: QObject(parent)
{
	callbackBottom* pBottom = new callbackBottom();
	pBottom->SetCallBackFunc((Refresh_CallBack)RefreshNode_CB, this);
}

callbackTopper::~callbackTopper()
{

}

void callbackTopper::RefreshNode_CB(void *lp,char* lc)
{
	callbackTopper * p = (callbackTopper*)(lp);
	p->outName(lc);
}

void callbackTopper::outName(char* cha)
{
	QString str = QString(QLatin1String(cha));
	qDebug() <<"result:" <<str;
}

callbackBottom.h

#ifndef CALLBACKBOTTOM_H
#define CALLBACKBOTTOM_H


//**************回调底层*****************示例********************//
#include <QObject>

typedef void(*Refresh_CallBack)(void *, char *);  // 函数指针 

class callbackBottom : public QObject
{
	Q_OBJECT

public:
	callbackBottom(QObject *parent= NULL);
	~callbackBottom();

	void SetCallBackFunc(Refresh_CallBack p, void* lpObject);

private:
	void* m_pUserData;
	Refresh_CallBack m_pFunc;
	void* m_pObject;
};

#endif // CALLBACKBOTTOM_H

callbackBottom.cpp

#include "callbackBottom.h"

callbackBottom::callbackBottom(QObject *parent)
	: QObject(parent)
{
	m_pUserData = NULL;
	m_pFunc = NULL;
	m_pObject = NULL;
}

callbackBottom::~callbackBottom()
{

}

void callbackBottom::SetCallBackFunc(Refresh_CallBack callback, void* lpObject)
{
	callback(lpObject, "test");
}

解析:

1. callbackTopper把自己的指针传给callbackBottom, pBottom->SetCallBackFunc((Refresh_CallBack)RefreshNode_CB, this);

    this当然也可以是你想传入的其他指针地址。

2. callbackBottom里面假设在处理一些数据,数据保存在char*里面

3. 然后在callbackBottom中就可以声明一个回调函数指针typedef void(*Refresh_CallBack)(void *, char *);

4. 然后实际处理的函数就是RefreshNode_CB这个函数了。这样底层就调用了上层,并且上层也得到了底层传来的数据。

猜你喜欢

转载自blog.csdn.net/Scarlett_OHara/article/details/86305311