XuSenfeng

个人站

复读了,更新随缘,有的文件不全或者图片缺失具体看我的笔记库(https://github.com/XuSenfeng/note)


信号槽

目录

信号槽

发送者==> 信号==> 接收者==>

槽就是一个函数,一般和信号函数相关联, 信号发生的时候槽函数会被执行

优势: 松散耦合

信号的发送接收本来没有关系

信号只用声明不用定义,但是槽需要定义

  • 信号
#include <QObject>

class School : public QObject
{
    Q_OBJECT
public:
    explicit School(QObject *parent = nullptr);

signals:    //信号关键字, 自定义的信号写在这里
    void send_messages();	//信号, 没有返回值, 只需要声明不需要实现, 可以有参数, 可以重载

};
class Student : public QObject
{
    Q_OBJECT
public:
    explicit Student(QObject *parent = nullptr);

signals:
public slots://槽的关键字, 早期的版本必须写在这里, 现在可以写在public
    void comeBackToClass();//槽实现函数, 返回值是void, 可以有参数, 可以发生重载
};
  • 注册以及发送信号
//这里使用的是Qt4的连接方法, 连接的是没有参数的两个函数, 编译器不会进行检查
connect(school, SIGNAL(send_messages()), student, SLOT(comeBackToClass()));

//实际上就是传递函数的地址
//connect(myBtn, &QPushButton::clicked, this, &myVidget::close);

emit school->send_messages();	//实际产生信号

四个参数就是上面的四个结构

在实际打印的时候由于QString类型的参数会打印出一个双引号, 所以需要进行一个类型的装换, 转换为char *

foodName.toUtf8().data()

首先转换为QByteArray类型, 之后再次转换

一个信号可以连接多个槽, 一个槽可以连接多个信号, 一个信号可以连接另一个信号

button =new QPushButton(this);
button->setText("我是傻逼");
button->setGeometry(50, 50, 50, 25);
this->resize(1024, 600);

设置按钮, 设置窗口

void (Teacher:: *teacherSignal)(QString) = &Teacher::hungry;
void (Student:: *studentSignal)(QString) = &Student::treat;
connect(zt, teacherSignal, st, studentSignal);

使用函数的重载的时候调用的函数, 使用函数指针进行重载, 槽函数和信号函数的参数类型是需要进行匹配, 信号参数的数量需要比槽函数的数量多

信号连接亦可以断开

disconnect()

参数和上面一样