Qt自定义信号和槽

1.自定义信号使用条件

  1. 声明在类的signals域下
  2. 没有返回值,void类型的函数
  3. 只有函数声明,没有定义
  4. 可以有参数,可以重载
  5. 通过emit关键字来触发信号,形式:emit object->sig(参数);

 2.自定义槽函数的使用

  1. qt4 必须声明在 private/public/protected slots域下面,qt5之后可以声明public下,同时还可以是静态的成员函数,全局函数,lambda表达式
  2. 没有返回值,void类型的函数
  3. 不仅有声明,还得要有实现
  4. 可以有参数,可以重载

3.使用自定义信号和槽 

定义场景:下课了,老师跟同学说肚子饿了(信号),学生请老师吃饭(槽)

首先定义一个学生类和老师类:(新建.cpp和.h文件)

老师类中声明信号 饿了 hungry

#ifndef TEACHER_H
#define TEACHER_H

#include <QObject>

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

signals:
    //自定义信号写到signals下
    //返回值是void,只需要声明,不需要实现
    //可以有参数,可以重载
    void hungry();


public slots:
};

#endif // TEACHER_H

学生类中声明槽 请客treat

#ifndef STUDENT_H
#define STUDENT_H

#include <QObject>

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

signals:

public slots:
    //返回值 void,需要声明,也需要实现
    //可以有参数,也可以发生重载
    void treat();
};

#endif // STUDENT_H

在窗口中声明一个公共方法下课,这个方法的调用会触发老师饿了这个信号,而响应槽函数学生请客

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include "teacher.h"
#include "student.h"


class MyWidget : public QWidget
{
    Q_OBJECT

public:
    MyWidget(QWidget *parent = 0);
    ~MyWidget();
private:
    Teacher * zt;
    Student * st;

    void classIsOver();
};

#endif // MYWIDGET_H
#include "mywidget.h"

//Teacher 老师类
//Student 学生类
//下课后,老师会触发一个信号,饿了,学生响应信号,请客吃饭

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    //创建一个老师对象
    this->zt = new Teacher(this);

    //创建一个学生对象
    this->st = new Student(this);

    //老师饿了,学生请客的连接
    connect(zt,&Teacher::hungry,st,&Student::treat);

    //调用下课函数
    classIsOver();
}

void MyWidget::classIsOver()
{
    //下课函数,调用后 触发老师饿了的信号
    emit zt->hungry();
}
MyWidget::~MyWidget()
{

}

学生响应了槽函数,并且打印信息

自定义槽函数 实现

#include "student.h"
#include "qdebug.h"

Student::Student(QObject *parent) : QObject(parent)
{

}

void Student::treat()
{
    qDebug()<<"请老师吃饭";
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值