什么时候使用函数指针?
在Qt中,在Qt5及之后的版本提供了新的调用信号与槽的方式,但是这种方式需要使用函数指针才能实现,这里写一个例子
class Eg{
public:
private:
signals:
void prj();//无需传参,直接调用
void prj(QString word);//需要传参的同名函数
public slots:
}
在这段代码中,我们在Eg类中声明了prj函数,假如此时我有一个QPushButton类的按钮叫做button,实例化一个Eg类的对象为exam,我想要当我点击(clicked)这个按钮的时候,调用prj(QString word)这个函数,即
connect(button,&QPushButton::clicked,exam,&Eg::prj);
但是,这么写的话编译器不能识别调用的究竟是哪个prj,因此我们需要对其进行进一步说明,将其改为
void (*prjString)(QString) = &Eg::prj;//定义一个函数指针
connect(button,&QPushButton::clicked,exam,prjString);
其中最关键的步骤就是定义这个函数指针prjString
函数指针的内容解释
- void:这一点与函数重载的要求一致
- (*prjString):说明这是个指针函数,要注意的是:括号不能少,少了括号也就是 *prjString说明这接收的是等号右边的函数的值,在这里是很明显的语法错误
- (QString):这个是传参的意思,要与你调用的函数的形参列表一致
另一种方式调用函数重载
虽然Qt5之后添加了新的调用方式,但是原来的依然适用,我们还可以这么写
connect(button,SIGNALS(clicked()),exam,SLOT(prjString(QString));
但是这种方式存在一些问题:此方式由于是调用了Qt提供的两个宏,所以当调用的函数名写错了的时候编译器是不会报错的,这会导致出现了问题很难发现