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;
}

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