需求:老師下課,發出餓了的信號,學生請喫飯
1. 說明
- 信號
- 返回值 void 只需要聲明,不需要實現
- 可以有參數,可以重載
- 槽函數
- 早期響應信號槽函數 QT 必須寫在
public slot:
,高級版本可以到public或者全局下 - 可以有參數,可以發生重載
- 返回值 void,需要聲明,也需要實現
- 早期響應信號槽函數 QT 必須寫在
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;
}