connect(信号的发送方,发送的信号,信号的接收方,信号的处理(槽函数))
信号槽的优点:松散耦合,信号的发送端和接收端 本身是没有关联的,他们通过connect函数连接在一起,将两端耦合
一、使用QT信号与槽
//创建一个自己的按钮
MyPushButton * mybtn = new MyPushButton();
mybtn->setText("我自己的按钮");
mybtn->setParent(this);
mybtn->move(200,100);
//参数一:信号发送者 参数二 发送的信号(信号查询帮助文档,查看信号的发送者本身拥有什么信号,或者说继承到了什么信号,然后将地址写出来 书写形式 &类名也可以使用父类的类名):: 信号名)
//参数三:信号接收者 参数四 接受的槽函数 (查询帮助文档,查看该接收者具有的slot槽处理函数有哪些,然后将对应的地址写上去 书写形式 &类名(也可以使用父类的类名):: 槽函数名)
connect(mybtn, &QPushButton::clicked, this, &QWidget::close);
查询帮助文档步骤
(1)找到帮助文档的文件 并打开 Assistant 5.12.10
(2)此处由于mybtn(信号发送者)是自己创建的,所以无法在文档中直接搜该类。但又由于该类继承了QPushButton,所以搜索QPushButton
可以看到有四个信号继承于QAbstractButton 然后点击QAbstractButton会看到该类的信号函数
(3)槽函数同理
二、自定义信号与槽
实例:实现下课后 老师饿了 学生请吃饭
(1)首先创建基础窗口
(2)创建学生和教师类 ,并写入信号和槽函数
#ifndef TEACHER_H
#define TEACHER_H
#include <QObject>
//Teacher.h头文件
class Teacher : public QObject
{
Q_OBJECT
public:
explicit Teacher(QObject *parent = nullptr);
signals:
//自定义信号写在这里
//返回值是void,只需要声明,不需要实现
//可以有参数,可以重载
void hungry();
};
#endif // TEACHER_H
#include "teacher.h"
//Teacher.cpp 文件
Teacher::Teacher(QObject *parent) : QObject(parent)
{
}
#ifndef STUDENT_H
#define STUDENT_H
#include <QObject>
//Student.h 头文件
class Student : public QObject
{
Q_OBJECT
public:
explicit Student(QObject *parent = nullptr);
//槽函数可以写在public中(早期QT必须写在public slots,高级版本可以写到 public 或者全局下)
//返回值是void,需要声明也需要实现
//可以有函数,可以发生重载
void treat();
signals:
};
#endif // STUDENT_H
#include "student.h"
#include <QDebug>
//Student.cpp文件
Student::Student(QObject *parent) : QObject(parent)
{
}
void Student::treat(){
qDebug() << "请客吃饭";
}
(3)在窗口的.cpp文件中创建关联
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include"teacher.h"
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
void classIsOver(Teacher *teacher);//老师下课函数
};
#endif // WIDGET_H
#include "widget.h"
#include "student.h"
#include "teacher.h"
#include <QDebug>
//Teacher类 老师类
//Student类 学生类
//下课后,老师饿了,学生请客
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
//创建一个老师对象
Teacher *teacher = new Teacher();
teacher->setParent(this);
//this->zt = new Teacher(this);
//创建一个学生对象
Student *student = new Student();
student->setParent(this);
//老师饿了,学生请客
connect( teacher, &Teacher::hungry, student, &Student::treat);
classIsOver(teacher);
}
void Widget::classIsOver(Teacher *teacher){
//触发提交
emit teacher->hungry();
}
Widget::~Widget()
{
}