QT自定义信号signal和(带参数/不带参数)槽函数slot

需求:老师下课,发出饿了的信号,学生请吃饭

1. 说明

  • 信号
    • 返回值 void 只需要声明,不需要实现
    • 可以有参数,可以重载
  • 槽函数
    • 早期响应信号槽函数 QT 必须写在public slot:,高级版本可以到public或者全局下
    • 可以有参数,可以发生重载
    • 返回值 void,需要声明,也需要实现

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:
    //早期响应信号槽函数 QT 必须写在该位置,高级版本可以到public或者全局下
    //可以有参数,可以发生重载
    //返回值 void,需要声明,也需要实现

    void treat();
    void treat(QString foodName);
};

#endif // STUDENT_H
student.cpp
#include "student.h"
#include <QDebug>
Student::Student(QObject *parent) : QObject(parent)
{

}
void Student::treat()
{
    qDebug() << "请老师吃饭";
}
void Student::treat(QString fondName)
{
    qDebug() << "请老师吃饭,老师要吃 "<<fondName;
}
teacher.h
#ifndef TEACHER_H
#define TEACHER_H

#include <QObject>

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

signals:
    //自定义信号位置
    //返回值 void 只需要声明,不需要实现
    //可以有参数,可以重载
    void hungry();
	//信号重载
    void hungry(QString fondName);
public slots:
};

#endif // TEACHER_H

teacher.cpp
#include "teacher.h"

Teacher::Teacher(QObject *parent) : QObject(parent)
{

}

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 = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;

    Teacher *zt;
    Student *st;

    void classIsOver();
};

#endif // WIDGET_H

widget.cpp
#include "widget.h"
#include "ui_widget.h"

/**
Teacher 类
Student 类
老师下课触发一个信号,饿了,学生响应该信号
*/
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    //创建一个老师对象
    this->zt = new Teacher();
    //创建一个学生对象
    this->st = new Student();
	
	//不带参数连接
    //建立 老师饿了学生请吃饭 的信号连接
    //connect(zt,&Teacher::hungry,st,&Student::treat);
    //需要先连接
    //classIsOver();
    
    //带参数的信号连接
    //函数指针,限定作用域
    void(Teacher:: *teacherSignal)(QString) = &Teacher::hungry;
    void(Student:: *studentSlot)(QString) = &Student::treat;
    connect(zt,teacherSignal,st,studentSlot);
    classIsOver();
}
void Widget::classIsOver()
{
    //下课函数:调用后,触发老师饥饿的信号
    emit zt->hungry();
}
Widget::~Widget()
{ 
    delete ui;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章