信号和槽的重载
当自定义信号和槽 出现重载时候,原先写法失效,因为执行的函数地址不明确
解决方法: 利用函数指针 来明确指向哪个函数的地址
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "teacher.h"
#include "student.h"
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
Teacher * teacher;
Student * student;
void classOver();
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
teacher = new Teacher(this);//this表示将Teacher放在Widget的childern()表中,不用管对象释放
student = new Student(this);
//连接2个对象之间的关系
// connect(teacher, &Teacher::hungry, student, &Student::treat);
//有参 信号和槽的链接
//函数指针 执行函数地址
void (Teacher:: * teacherSignal)(QString) = &Teacher::hungry;
void(Student:: * studentSlot )(QString) = &Student::treat;
connect(teacher, teacherSignal, student, studentSlot );
classOver();
}
void Widget::classOver()
{
//出发老师类中的信号
//老师的hungry的信号属于自定义的信号,触发自定义信号的关键字 emit
emit teacher->hungry();//触发无参信号
emit teacher->hungry("aaaaaaaaaaaaa");//触发有参信号
}
Widget::~Widget()
{
}
teacher.h
#ifndef TEACHER_H
#define TEACHER_H
#include <QObject>
class Teacher : public QObject
{
Q_OBJECT
public:
explicit Teacher(QObject *parent = 0);
~Teacher();
signals:
//自定义的信号,需要写道signals下面,返回类型必须是void
//没有返回值,不需要实现,只需要声明
//可以有参数,可以重载
void hungry();
void hungry(QString foodName);
public slots:
};
#endif // TEACHER_H
teacher.cpp
#include "teacher.h"
Teacher::Teacher(QObject *parent) : QObject(parent)
{
}
Teacher::~Teacher()
{
}
student.h
#ifndef STUDENT_H
#define STUDENT_H
#include <QObject>
class Student : public QObject
{
Q_OBJECT
public:
explicit Student(QObject *parent = 0);
~Student();
signals:
public slots:
//自定义槽函数
//高版本可以写到上面的public下面,或者全局,最好写在这里防止漏掉了
//槽函数返回值void
//槽函数需要声明也需要实现
//槽函数也可以有参数 可以发生重载
void treat();
void treat(QString foodName);
};
#endif // STUDENT_H
student.cpp
#include "student.h"
#include <QDebug>
Student::Student(QObject *parent) : QObject(parent)
{
}
void Student::treat()
{
qDebug() <<"Student::treat()=====" ;
}
void Student::treat(QString foodName)
{
//QString 转 char * 先转成QByteArray类型 再转char *
qDebug() <<"Student::treat(QString foodName)=====" << foodName.toUtf8().data();
}
Student::~Student()
{
}
输出
Student::treat(QString foodName)===== aaaaaaaaaaaaa