接上文:QT从入门到实战x篇_xx_信号和槽1:Qt中自带的信号和槽函数的使用方法本文主要介绍如何根据自身的功能需要,创建和使用自定义信号及槽函数。
先写出一个功能需求:下课后 老师触发信号 饿了 学生响应信号 请客吃饭
1. 建立老师类和学生类
基类直接选择QObject,这样就可以将其创建到对象树中,不用考虑释放的问题。
2. 信号函数
在teacher类中定义信号函数,teacher.h中的内容:
signals:
//自定义信号 写到signals下
//返回值是void 只需要声明 不需要实现
//可以有参数 可以重载
void hungry();
3. 槽函数
在student类中定义信号函数,student.h中的进行声明:
public:
//早期Qt版本,必须写到public slots下,高版本可以写在public或者全局下
//返回值void 需要声明 也需要实现
//可以有参数 可以发生重载
void treat();
student.cpp中:
#include "student.h"
#include <QDebug>
Student::Student(QObject *parent) : QObject(parent)
{
}
void Student::treat()
{
qDebug()<<"请老师吃饭";
}
4. 将老师和学生对象连接起来
widget.h
public:
Widget(QWidget *parent = nullptr);
~Widget();
Teacher* zt;
Student* st;
在widget.cpp中:
//创建老师对象
zt=new Teacher(this); //this用来指定父亲的对象
//创建学生对象
st=new Student(this);
//老师饿了 学生请客连接
connect(zt,&Teacher::hungry,st,&Student::treat);
5. 下课后函数触发信号槽
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "teacher.h"
#include "student.h"
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
Teacher* zt;
Student* st;
void classIsOver();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include "teacher.h"
#include "student.h"
//Teacher类 老师类
//Student类 学生类
//场景:下课后 老师触发信号 饿了 学生响应信号 请客吃饭
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//创建老师对象
zt=new Teacher(this); //this用来指定父亲的对象
//创建学生对象
st=new Student(this);
//老师饿了 学生请客连接
connect(zt,&Teacher::hungry,st,&Student::treat);
//调用下课函数
classIsOver();
}
Widget::~Widget()
{
delete ui;
}
void Widget::classIsOver()
{
//下课函数 调用后 触发老师饿了的信号
emit zt->hungry();
}
运行后槽函数触发。
6. 自定义信号槽需要注意的事项:
- 发送者和接收者都需要是QObject的子类(当然,槽函数是全局函数、Lambda 表达式等无需接收者的时候除外);
- 信号和槽函数返回值是 void
- 信号只需要声明,不需要实现
- 槽函数需要声明也需要实现
- 槽函数是普通的成员函数,作为成员函数,会受到 public、private、protected 的影响;
- 使用 emit 在恰当的位置发送信号;
- 使用connect()函数连接信号和槽。
- 任何成员函数、static 函数、全局函数和 Lambda 表达式都可以作为槽函数
- 信号槽要求信号和槽的参数一致,所谓一致,是参数类型一致。
- 如果信号和槽的参数不一致,允许的情况是,槽函数的参数可以比信号的少,即便如此,槽函数存在的那些参数的顺序也必须和信号的前面几个一致起来。这是因为,你可以在槽函数中选择忽略信号传来的数据(也就是槽函数的参数比信号的少)。
7. 学习视频地址:自定义信号和槽函数的创建及使用