需求:老师下课,发出饿了的信号,学生请吃饭
1. 说明
- 信号
- 返回值 void 只需要声明,不需要实现
- 可以有参数,可以重载
- 槽函数
- 早期响应信号槽函数 QT 必须写在
public slot:
,高级版本可以到public或者全局下 - 可以有参数,可以发生重载
- 返回值 void,需要声明,也需要实现
- 早期响应信号槽函数 QT 必须写在
2.目录结构
说明:新建了两个类,一个老师,一个学生;
student.h
#ifndef STUDENT_H
#define STUDENT_H
#include <QObject>
class Student : public QObject
{
Q_OBJECT
public:
explicit Student(QObject *parent = nullptr);
signals:
public slots:
//早期响应信号槽函数 QT 必须写在该位置,高级版本可以到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() << "请老师吃饭";
}
void Student::treat(QString fondName)
{
qDebug() << "请老师吃饭,老师要吃 "<<fondName;
}
teacher.h
#ifndef TEACHER_H
#define TEACHER_H
#include <QObject>
class Teacher : public QObject
{
Q_OBJECT
public:
explicit Teacher(QObject *parent = nullptr);
signals:
//自定义信号位置
//返回值 void 只需要声明,不需要实现
//可以有参数,可以重载
void hungry();
//信号重载
void hungry(QString fondName);
public slots:
};
#endif // TEACHER_H
teacher.cpp
#include "teacher.h"
Teacher::Teacher(QObject *parent) : QObject(parent)
{
}
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <teacher.h>
#include <student.h>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
Teacher *zt;
Student *st;
void classIsOver();
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
/**
Teacher 类
Student 类
老师下课触发一个信号,饿了,学生响应该信号
*/
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//创建一个老师对象
this->zt = new Teacher();
//创建一个学生对象
this->st = new Student();
//不带参数连接
//建立 老师饿了学生请吃饭 的信号连接
//connect(zt,&Teacher::hungry,st,&Student::treat);
//需要先连接
//classIsOver();
//带参数的信号连接
//函数指针,限定作用域
void(Teacher:: *teacherSignal)(QString) = &Teacher::hungry;
void(Student:: *studentSlot)(QString) = &Student::treat;
connect(zt,teacherSignal,st,studentSlot);
classIsOver();
}
void Widget::classIsOver()
{
//下课函数:调用后,触发老师饥饿的信号
emit zt->hungry();
}
Widget::~Widget()
{
delete ui;
}