感谢B站视频,QT从入门到实战
1、需求
有两个类,Teacher类和Student类。
信号和槽:下课,老师饿了,学生请客吃饭。
老师是信号的发送方,信号为“饿了”;
学生是信号的接收方,要做的处理是“请客吃饭”。
2、建工程
- 新建以QWidget为基类的新工程。
- 添加两个C++ Class,Teacher类和Student类,基类选QObject(放在对象树上,不用管释放操作)
3、自定义的信号和槽
添加类之后,Teacher和Student类的头文件里会有signal和public slots区域,自定义的信号和槽就写在对应的部分下。
3.1、自定义的信号
- 返回值:void
- 需要声明,不需要实现
- 可以有参数,可以重载
疑问:不需要实现,参数有什么意义?
signals:
void hungry();
3.2、自定义的槽
- 返回值:void
- 需要声明,需要实现
- 可以有参数,可以重载
public slots:
void treat();
void Student::treat()
{
qDebug() >> "请客吃饭";
}
4、代码
4.1、teacher.h
#ifndef TEACHER_H
#define TEACHER_H
#include <QObject>
class Teacher : public QObject
{
Q_OBJECT
public:
explicit Teacher(QObject *parent = nullptr);
signals:
void hungry();
public slots:
};
#endif // TEACHER_H
4.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:
void treat();
};
#endif // STUDENT_H
4.3、student.cpp
#include "student.h"
#include <QDebug>
Student::Student(QObject *parent) : QObject(parent)
{
}
void Student::treat()
{
qDebug() << "请客吃饭";
}
4.4、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 = 0);
~Widget();
private:
Ui::Widget *ui;
Teacher *ls; //声明老师和学生的指针
Student *ly;
void ClassIsOver(); //下课
};
#endif // WIDGET_H
4.5、widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//创建一个老师的对象
this->ls = new Teacher(this);
//创建一个学生的对象
this->ly = new Student(this);
//先建立好逻辑
//信号和槽:老师饿了, 学生请客
connect(ls,&Teacher::hungry,ly,&Student::treat);
//下课
ClassIsOver();
}
//下课,触发老师饿了的信号
void Widget::ClassIsOver()
{
emit ls->hungry();
}
Widget::~Widget()
{
delete ui;
}