接上篇QT从入门到实战x篇_07_自定义信号及槽的重载(带参数的信号和槽的使用方法;将QString转换为Char*的结果)中介绍了自定义信号和槽函数的重载,本篇将会介绍信号连接信号以及断开连接的方法。
总结:
- 可以使用信号连接信号的方式触发槽函数;
- 使用
disconnect(...)
就可以实现已连接信号和槽的断开。
前面几篇中程序一旦运行就会触发下课并发送信号,现在将需求进行更改,在点击一个按钮之后再触发下课。
widget.cpp中内容如下:
#include "widget.h"
#include "ui_widget.h"
#include "teacher.h"
#include "student.h"
#include <QPushButton>
//Teacher类 老师类
//Student类 学生类
//场景:下课后 老师触发信号 饿了 学生响应信号 请客吃饭
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//创建老师对象
zt=new Teacher(this); //this用来指定父亲的对象
//创建学生对象
st=new Student(this);
//老师饿了 学生请客连接
// connect(zt,&Teacher::hungry,st,&Student::treat);
//函数指针指向函数地址
void(Teacher::*teacherSignal)(QString)=&Teacher::hungry;
void(Student::*studentSlot)(QString)=&Student::treat;
connect(zt,teacherSignal,st,studentSlot);
//调用下课函数
classIsOver();
//点击一个下课的按钮再触发下课
QPushButton* btn=new QPushButton("xiake",this);
//重置窗口大小
this->resize(600,400);
connect(btn,&QPushButton::clicked,this,&Widget::classIsOver);
}
Widget::~Widget()
{
delete ui;
}
void Widget::classIsOver()
{
//下课函数 调用后 触发老师饿了的信号
emit zt->hungry(QString::fromLocal8Bit("宫保鸡丁"));
}
运行结果:点击“xiake”
就会输出“下课了,老师要吃 宫保鸡丁”
。
上述的过程还是采用信号调用槽函数的方式。
1. 信号连接信号
下面代码使用无参槽函数并将按钮点击信号与另一个信号连接,从而实现“请老师吃饭的槽函数”
//无参信号和槽连接
void(Teacher::*teacherSignal2)(void)=&Teacher::hungry;
void(Student::*studentSlot2)(void)=&Student::treat;
connect(zt,teacherSignal2,st,studentSlot2);
//信号连接信号
connect(btn,&QPushButton::clicked,zt,teacherSignal2);
运行结果:调用了另一个信号对应的槽函数
- 信号连接信号的逻辑关系如下:
2. 断开信号和槽连接
使用
disconnect(...)
就可以实现已连接信号和槽的断开。
//无参信号和槽连接
void(Teacher::*teacherSignal2)(void)=&Teacher::hungry;
void(Student::*studentSlot2)(void)=&Student::treat;
connect(zt,teacherSignal2,st,studentSlot2);
//信号连接信号
connect(btn,&QPushButton::clicked,zt,teacherSignal2);
//信号断开
disconnect(zt,teacherSignal2,st,studentSlot2);
运行结果:因为zt
的信号与st
的连接断开了,因此点击按钮不会有任何输出
3. 学习视频地址:QT从入门到实战x篇_08_信号连接信号