需求: 学生向老师打招呼
学生偶遇老师 学生Stuend st 会发出一个信号 sayHi
老师响应信号 Teacher zt 处理信号的槽函数 reply
目录结构
student.h
#ifndef STUDENT_H
#define STUDENT_H
#include
class Student : public QObject
{
Q_OBJECT
public:
explicit Student(QObject *parent = nullptr);
signals:
//自定义信号需要写到signals下
//返回类型必须void
//信号只需要声明不需要实现
//信号可以有参数,可以重载
void Hello();
//重载
void Hello(QString str);
};
#endif // STUDENT_H
teacher.h
#ifndef TEACHER_H
#define TEACHER_H
#include
class Teacher : public QObject
{
Q_OBJECT
public:
explicit Teacher(QObject *parent = nullptr);
signals:
public slots:
//自定义槽函数
//高版本可以写到public下 或者全局函数
//槽函数返回值void
//槽函数需要声明也需要实现
//槽函数可以有参数,可以重载
void reply();
//重载
void reply(QString str);
};
#endif // TEACHER_H
在teacher.cpp中实现
#include "teacher.h"
#include
Teacher::Teacher(QObject *parent) : QObject(parent)
{
}
//槽函数实现
void Teacher:: reply()
{
qDebug() << "you homework is finish?";
}
void Teacher:: reply(QString str)
{
// qDebug() << "you "<
//QString 转 char* 先转成QByterray英型再转char * 去掉双引号
qDebug() << "you "<
}
参数1 信号的发送者 参数2 发送的信号 参数3 信号的接受者 参数4 处理的槽函数(函数地址)
onnect(st, &Student::Hello, zt, &Teacher::reply);
connect(st,SIGNAL(Hello()),zt,SLOT(reply()));
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include
#include "student.h"
#include "teacher.h"
QT_BEGIN_NAMESPACE
namespace Ui { //命名空间
class Widget;//ui_widget.h文件里定义的类 外部声明
}
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT // 宏,使用QT信号与槽机制必须添加
public:
Widget(QWidget *parent = nullptr);
~Widget();
Teacher * zt;
Student * st;
//偶遇
void crossAbout();
private:
Ui::Widget *ui; //Ui :: Widget类型的一个指针,指向可视化的界面
};
#endif // WIDGET_H
widget.cpp实现
#include "widget.h"
#include "ui_widget.h"
#include
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);//实现了组件的各种设置,信号与槽的关联
//this 关闭窗口时会顺便把 st 释放掉
st = new Student(this);
zt = new Teacher(this);
//连接学生与老师
//参数1 信号的发送者 参数2 发送的信号 参数3 信号的接受者 参数4 处理的槽函数(函数地址)
//connect(st, &Student::Hello, zt, &Teacher::reply);
// connect(st,SIGNAL(Hello()),zt,SLOT(reply()));
//有参数,信号与槽连接
//函数指针 执行函数地址
// 当自定义信号和槽出现重载时候,原先写法失效,因为执行的函数地址不明确,
// 解决方法:利用函数指针来明确指向哪个函数的地址。
//void(Student:: *studentSignal)(QString)=&Student::Hello;
// void(Teacher:: *teacherSlot)(QString) =&Teacher::reply;
// connect(st, studentSignal, zt,teacherSlot );
//偶遇
//crossAbout();
//信号和槽的拓展
//1.信号可以连接信号
//2.信号和槽可以断开disconnect
//3.一个信号可以触发多个槽函数
//4.多个信号可以连接同一个槽函数
//5.信号和槽的参数必须一-对应
//信号的参数个数可以大于槽函数的参数个数,反之不可以。
//点击按钮,才偶遇
QPushButton *btn = new QPushButton("偶遇",this);
//触发无参 信号和槽
//1.信号 连接 信号
void(Student:: *noStudentSignal)(void)=&Student::Hello;
void(Teacher:: *noTeacherSlot)(void) =&Teacher::reply;
connect(btn,&QPushButton::clicked,st,noStudentSignal);
connect(st, noStudentSignal, zt,noTeacherSlot );
// connect(btn,&QPushButton::clicked,this,&Widget::close);3.一个信号可以触发多个槽函数
//2.断开信号和槽
// disconnect(st, noStudentSignal, zt,noTeacherSlot );
//重置大小
resize(600,400);
}
Widget::~Widget()
{
delete ui;
}
//偶遇
void Widget::crossAbout(){
//触发打招呼的信号
//打招呼属于自定义信号,触发自定义信号关键宇 emit
emit st->Hello();//触发无参数信号
emit st->Hello("语文");
}