网站开发公司徐州/产品推广计划
接上篇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_信号连接信号