主要有3种写法
1.普通函数(全局函数)作为回调函数
这个就跟C语言里面的一样,没什么好说的
2.类的普通成员函数作为回调函数
基本知识
类的成员函数实际上是有一个隐含的void*形参的(由编译器给自动加上的),这个实际上就是所属类给它传递的this指针,不然该成员函数怎么不加前缀就能访问类中的其它成员的嘛。
目标
实现Add类向MainWindow类注册一个成员函数int addFun(),作为回调函数
实际上这个函数全称是 int addFun(void*)。所以注册函数定义时候,就需要把形参给对好
示例代码分析
add.cpp文件(头文件就不展示了,过于简单)
//将函数地址强转为 int(*)(void *) 类型。注:这里成员函数名前加上&才是地址(而全局函数就不需要),否则编译报错
#include "add.h"
#include "mainwindow.h"
extern MainWindow* pMainWindow;
//普通函数(全局函数)
int addFun1()
{
return 2;
}
//类的成员函数
int Add::addFun()
{
return 3;
}
Add::Add()
{
//将函数地址强转为 int(*)(void *) 类型。注:这里成员函数名前加上&才是地址,否则编译报错
pMainWindow->registerFun((int(*)(void *)) &addFun);
}
mainwindow.cpp文件
MainWindow::registerFun(int(*pfun)(void *))
{
mPfun = pfun;
}
//按钮按下后,打印出值
void MainWindow::on_toolButton_clicked()
{
new Add();
void* p; //因为回调函数要求mPfun要求一个形参,这里就随便给一个吧
int a = mPfun(p);
qDebug()<<a; //控制台打印出了 3
}
注意点
回调函数由于在别的地方执行了,不再能访问当初自己的类中的成员了,所以我们注册函数需要再加一个形参,来支持注册的时候可以把当初的this指针也给传过去,那么该成员函数在别的类中,就仍然可以访问它原来所在类的成员了。
3.类的静态成员函数作为回调函数
这个也是很简单,自己看看我的引用博客