QT信号与槽

自定义信号与槽

需求: 学生向老师打招呼

学生偶遇老师 学生Stuend st 会发出一个信号 sayHi

老师响应信号 Teacher zt 处理信号的槽函数 reply

目录结构

QT信号与槽_第1张图片
1.建立Student类,定义一个自定义信号

student.h

#ifndef STUDENT_H

#define STUDENT_H

#include

class Student : public QObject

{

Q_OBJECT

public:

explicit Student(QObject *parent = nullptr);

signals:

//自定义信号需要写到signals下

//返回类型必须void

//信号只需要声明不需要实现

//信号可以有参数,可以重载

void Hello();

//重载

void Hello(QString str);

};

#endif // STUDENT_H

2.建立Teacher类,自定义槽函数

teacher.h

#ifndef TEACHER_H

#define TEACHER_H

#include

class Teacher : public QObject

{

Q_OBJECT

public:

explicit Teacher(QObject *parent = nullptr);

signals:

public slots:

//自定义槽函数

//高版本可以写到public下 或者全局函数

//槽函数返回值void

//槽函数需要声明也需要实现

//槽函数可以有参数,可以重载

void reply();

//重载

void reply(QString str);

};

#endif // TEACHER_H

在teacher.cpp中实现

#include "teacher.h"

#include

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

{

}

//槽函数实现

void Teacher:: reply()

{

qDebug() << "you homework is finish?";

}

void Teacher:: reply(QString str)

{

// qDebug() << "you "<

//QString 转 char* 先转成QByterray英型再转char * 去掉双引号

qDebug() << "you "<

}

3.在widget中连接

参数1 信号的发送者 参数2 发送的信号 参数3 信号的接受者 参数4 处理的槽函数(函数地址)

onnect(st, &Student::Hello, zt, &Teacher::reply);

connect(st,SIGNAL(Hello()),zt,SLOT(reply()));

widget.h

#ifndef WIDGET_H

#define WIDGET_H

#include

#include "student.h"

#include "teacher.h"

QT_BEGIN_NAMESPACE

namespace Ui { //命名空间

class Widget;//ui_widget.h文件里定义的类 外部声明

}

QT_END_NAMESPACE

class Widget : public QWidget

{

Q_OBJECT // 宏,使用QT信号与槽机制必须添加

public:

Widget(QWidget *parent = nullptr);

~Widget();

Teacher * zt;

Student * st;

//偶遇

void crossAbout();

private:

Ui::Widget *ui; //Ui :: Widget类型的一个指针,指向可视化的界面

};

#endif // WIDGET_H

widget.cpp实现

#include "widget.h"

#include "ui_widget.h"

#include

Widget::Widget(QWidget *parent)

: QWidget(parent)

, ui(new Ui::Widget)

{

ui->setupUi(this);//实现了组件的各种设置,信号与槽的关联

//this 关闭窗口时会顺便把 st 释放掉

st = new Student(this);

zt = new Teacher(this);

//连接学生与老师

//参数1 信号的发送者 参数2 发送的信号 参数3 信号的接受者 参数4 处理的槽函数(函数地址)

//connect(st, &Student::Hello, zt, &Teacher::reply);

// connect(st,SIGNAL(Hello()),zt,SLOT(reply()));

//有参数,信号与槽连接

//函数指针 执行函数地址

// 当自定义信号和槽出现重载时候,原先写法失效,因为执行的函数地址不明确,

// 解决方法:利用函数指针来明确指向哪个函数的地址。

//void(Student:: *studentSignal)(QString)=&Student::Hello;

// void(Teacher:: *teacherSlot)(QString) =&Teacher::reply;

// connect(st, studentSignal, zt,teacherSlot );

//偶遇

//crossAbout();

//信号和槽的拓展

//1.信号可以连接信号

//2.信号和槽可以断开disconnect

//3.一个信号可以触发多个槽函数

//4.多个信号可以连接同一个槽函数

//5.信号和槽的参数必须一-对应

//信号的参数个数可以大于槽函数的参数个数,反之不可以。

//点击按钮,才偶遇

QPushButton *btn = new QPushButton("偶遇",this);

//触发无参 信号和槽

//1.信号 连接 信号

void(Student:: *noStudentSignal)(void)=&Student::Hello;

void(Teacher:: *noTeacherSlot)(void) =&Teacher::reply;

connect(btn,&QPushButton::clicked,st,noStudentSignal);

connect(st, noStudentSignal, zt,noTeacherSlot );

// connect(btn,&QPushButton::clicked,this,&Widget::close);3.一个信号可以触发多个槽函数

//2.断开信号和槽

// disconnect(st, noStudentSignal, zt,noTeacherSlot );

//重置大小

resize(600,400);

}

Widget::~Widget()

{

delete ui;

}

//偶遇

void Widget::crossAbout(){

//触发打招呼的信号

//打招呼属于自定义信号,触发自定义信号关键宇 emit

emit st->Hello();//触发无参数信号

emit st->Hello("语文");

}

你可能感兴趣的:(C++,c++)