信号与槽机制

1. 信号与槽机制(重点,但不是难点)

1.1 机制:

是一种两个对象之间的通信的机制

例如:

鼠标双击-------文件夹图标---------打开文件夹功能

通信的过程:

用户对象

文件夹图标对象

鼠标双击,相当于告诉文件夹(即给文件夹一个信号),我现在想要打开你

文件收到信号,就执行打开文件夹的功能

信号:在QT中信号用函数来进行体现

槽:在QT中槽也是用函数来进行体现

1.2 实现两个对象之间的通信:

提前将两个对象进行绑定(类似于成为你的QQ好友)

1.2.1 QT中提供了绑定的函数(方法):

connect函数原型:
connect(对象1,对象1发出的信号,对象2,处理对象1发出的信号);//来自于QObject
connect(对象1,SIGNAL(信号),对象2,SLOT(槽));

1对象1:是一个类的实例化,信号的发出者

2对象1发出的信号:信号,实质上是一个函数,信号是对象1中的函数,信号使用     SIGNAL函数包含

3对象2:是一个类的实例化,信号的接收者

4处理对象1发出的信号:槽,实质上也是一个函数,槽是对象2中的函数,槽使用SLOT 函数包含

QObject中的原型:
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
QMetaObject::Connection connect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type = Qt::AutoConnection)
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection)
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type = Qt::AutoConnection)

1.3 细节重点

(1)connect函数不仅可以绑定一个信号和槽,也能绑定两个信号

(2)多个信号可以绑定同一个槽函数

(3)一个信号可以绑定多个槽,先绑定哪个槽,哪个槽先执行,后绑定后执行

2. 自定义信号与槽

2.1 信号:在类中需要放置在关键字signals下

例如:
		signals:
			信号1;
			信号2;
			......

2.1.1 注意事项:

(1)信号只需要声明,不需要实现

(2)信号的返回值类型是void类型

(3)信号也是可以发生重载

(4)信号的参数个数必须大于等于槽函数的参数个数

2.2 槽:在类中需要放置在关键字slots下

例如:
		slots:
			槽1;
			槽2;
			....

2.2.1 注意事项

(1slots前可以加上修饰符:public、protected、private(与C++中修饰符的作用一致)

(2)槽函数既需要声明,也需要实现

(3)槽函数的返回值类型一般也是设置为void类型

(4)当槽函数的参数与信号的参数一致时,需要满足槽函数的参数类型和信号的参数类型保持一致

2.3 信号的触发:

使用emit关键字对信号进行触发

格式:

emit    信号;//将信号给发送出去

2.4  举例:

2.4.1 练习1

车上的司机,看见红灯亮了之后,车就停下,人过马路

对象1:车

信号:车看见红灯亮了,停下

对象2:人

槽:人就可以过马路

绑定:使用connect函数绑定车和人两个对象

course1

Car.h

#ifndef CAR_H
#define CAR_H

#include <QObject>

class Car : public QObject
{
    Q_OBJECT
public:
    explicit Car(QObject *parent = nullptr);

signals://写在signals以下的函数都是该类的信号函数

    //在qt中信号只需要声明不需要实现
    void car_Stop();//表示该函数是Car类的信号

};

#endif // CAR_H

car.cpp

#include "car.h"

Car::Car(QObject *parent)
    : QObject{parent}
{

}

people.h

#ifndef PEOPLE_H
#define PEOPLE_H

#include <QObject>
#include <QDebug>

class People : public QObject
{
    Q_OBJECT
public:
    explicit People(QObject *parent = nullptr);

signals:

public slots://写在slots以下的函数都是该类的槽
    void walk();

};

#endif // PEOPLE_H

people.cpp

#include "people.h"

People::People(QObject *parent)
    : QObject{parent}
{

}

void People::walk(){
    qDebug()<<"人收到车停下的信号,可以过马路"<<endl;
}

mydialog.h

#ifndef MYDIALOG_H
#define MYDIALOG_H

#include <QDialog>
#include <QDebug>
#include <car.h>
#include <people.h>

QT_BEGIN_NAMESPACE
namespace Ui { class MyDialog; }
QT_END_NAMESPACE

class MyDialog : public QDialog
{
    Q_OBJECT

public:
    MyDialog(QWidget *parent = nullptr);
    ~MyDialog();

    void emit_Car_Stop_Signal();//发送信号函数

private:
    Ui::MyDialog *ui;

    //实例化方式1
    Car* car = new Car;//实例化车
    People* people = new People;//实例化人

    //实例化方式2
//    Car car;
//    People people;


};
#endif // MYDIALOG_H

mydialog.cpp

#include "mydialog.h"
#include "ui_mydialog.h"

//练习
//    车上的司机,看见红灯亮了之后,车就停下,人过马路
//    对象1:车
//    信号:车看见红灯亮了,停下
//    对象2:人
//    槽:人就可以过马路
//    绑定:使用connect函数绑定车和人两个对象

MyDialog::MyDialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::MyDialog)
{
    ui->setupUi(this);

    //向控制台打印消息
//    qDebug()<<"hello world";
//    qDebug("你好,世界");

    //1.先实现人车对象的绑定
    connect(this->car,SIGNAL(car_Stop()),this->people,SLOT(walk()));//SIGNAL()和SLOT()将你传来的参数转为字符串类型


    //2. 在调用信号触发函数
    this->emit_Car_Stop_Signal();


}

//析构
MyDialog::~MyDialog()
{
    delete ui;
}

void MyDialog:: emit_Car_Stop_Signal(){
    //进行信号的触发
    emit this->car->car_Stop();
}


main.cpp

#include "mydialog.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyDialog w;
    w.show();
    return a.exec();
}

2.4.2 练习2 元旦节发红包

写法1

快到元旦节了,老师给张三发红包,但是老师没张三微信,就先发给李四,让李四转交给张三,张三收到红包后说谢谢老师

course1-1

teacher.h

#define TEACHER_H

#include <QObject>

class Teacher : public QObject
{
    Q_OBJECT
public:
    explicit Teacher(QObject *parent = nullptr);

signals:
    //发送红包的信号函数
    void send();

};

#endif // TEACHER_H

teacher.cpp

#include "teacher.h"

Teacher::Teacher(QObject *parent)
    : QObject{parent}
{

}

lisi.h

#ifndef LISI_H
#define LISI_H

#include <QObject>
#include <QDebug>

class Lisi : public QObject
{
    Q_OBJECT
public:
    explicit Lisi(QObject *parent = nullptr);

signals:
    void zhuanjiao();//转交红包

public slots:
    void jieshou_zhuanjiao();//接收老师的红包转交给张三

};

#endif // LISI_H

lisi.cpp

#include "lisi.h"

Lisi::Lisi(QObject *parent)
    : QObject{parent}
{

}

void Lisi::jieshou_zhuanjiao(){
    qDebug()<<"lisi代替zhangsan接收到红包,马上转交给zhangsan"<<Qt::endl;
    emit this->zhuanjiao();//转交红包,触发信号触发的是李四的信号
}

zhangsan.h

#ifndef ZHANGSAN_H
#define ZHANGSAN_H

#include <QObject>
#include <QDebug>

class Zhangsan : public QObject
{
    Q_OBJECT
public:
    explicit Zhangsan(QObject *parent = nullptr);

signals:

public slots://槽
    void xiexie();//谢谢老师

};

#endif // ZHANGSAN_H

zhangsan.cpp

#include "zhangsan.h"

Zhangsan::Zhangsan(QObject *parent)
    : QObject{parent}
{

}
void Zhangsan::xiexie(){
    qDebug()<<"zhangsan接收到lisi转交的红包,并说了:谢谢老师的红包"<<endl;
}

mydialog.h

#ifndef MYDIALOG_H
#define MYDIALOG_H

#include <QDialog>
#include <teacher.h>
#include <lisi.h>
#include <zhangsan.h>

QT_BEGIN_NAMESPACE
namespace Ui {
    class Mydialog;
}
QT_END_NAMESPACE

class Mydialog : public QDialog
{
    Q_OBJECT

public:
    Mydialog(QWidget *parent = nullptr);
    ~Mydialog();

    void emit_hongbao_Signal();//发送信号函数


private:
    Ui::Mydialog *ui;


    //实例化对象
    Teacher* tea=new Teacher;
    Lisi* lisi = new Lisi;
    Zhangsan* zhangsan = new Zhangsan;

};
#endif // MYDIALOG_H



mydialog.cpp

#include "mydialog.h"
#include "ui_mydialog.h"


//练习2
//快到元旦节了,老师给张三发红包,但是老师没张三微信,就先发给李四,让李四转交给张三,张三收到红包后说谢谢老师

Mydialog::Mydialog(QWidget *parent): QDialog(parent), ui(new Ui::Mydialog){//构造
    ui->setupUi(this);

    //绑定老师与李四
    connect(this->tea,SIGNAL(send()),this->lisi,SLOT(jieshou_zhuanjiao()));

    //绑定李四与张三
    connect(this->lisi,SIGNAL(zhuanjiao()),this->zhangsan,SLOT(xiexie()));

    //调用信号触发
    this->emit_hongbao_Signal();

}

Mydialog::~Mydialog()
{
    delete ui;
}

void Mydialog:: emit_hongbao_Signal(){
    //进行信号的触发,触发老师的信号
    emit this->tea->send();
}



写法2

course1-2

teacher.h

#ifndef TEACHER_H
#define TEACHER_H

#include <QObject>

class Teacher : public QObject
{
    Q_OBJECT
public:
    explicit Teacher(QObject *parent = nullptr);

signals:
    void Tea_send_Red_Package();//老师发送红包信号
};

#endif // TEACHER_H

teacher.cpp

#include "teacher.h"

Teacher::Teacher(QObject *parent)
    : QObject{parent}
{

}

lisi.h

#ifndef LISI_H
#define LISI_H

#include <QObject>

class Lisi : public QObject
{
    Q_OBJECT
public:
    explicit Lisi(QObject *parent = nullptr);

signals:
    void lisi_send_Red_Package();//李四转交信号

};

#endif // LISI_H

lisi.cpp

#include "lisi.h"

Lisi::Lisi(QObject *parent)
    : QObject{parent}
{

}

zhangsan.h

#ifndef ZHANGSAN_H
#define ZHANGSAN_H

#include <QObject>
#include <QDebug>

class Zhangsan : public QObject
{
    Q_OBJECT
public:
    explicit Zhangsan(QObject *parent = nullptr);

signals:

public slots:
    void receive_Red_Package();//接收红包槽

};

#endif // ZHANGSAN_H

zhangsan.cpp

#include "zhangsan.h"

Zhangsan::Zhangsan(QObject *parent)
    : QObject{parent}
{

}

void Zhangsan::receive_Red_Package(){

    qDebug()<<"谢谢老师"<<Qt::endl;
}

mydialog.h

#ifndef MYDIALOG_H
#define MYDIALOG_H

#include <QDialog>
#include <teacher.h>
#include <lisi.h>
#include <zhangsan.h>

QT_BEGIN_NAMESPACE
namespace Ui { class Mydialog; }
QT_END_NAMESPACE

class Mydialog : public QDialog
{
    Q_OBJECT

public:
    Mydialog(QWidget *parent = nullptr);
    ~Mydialog();

private:
    Ui::Mydialog *ui;

    //实例化对象
    Teacher* tea=new Teacher;
    Lisi* lisi = new Lisi;
    Zhangsan* zhangsan = new Zhangsan;

};
#endif // MYDIALOG_H

mydialog.cpp

#include "mydialog.h"
#include "ui_mydialog.h"

Mydialog::Mydialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Mydialog)
{
    ui->setupUi(this);

    //绑定,在connect中可以绑定两个信号
    connect(this->tea,SIGNAL(Tea_send_Red_Package()),this->lisi,SIGNAL(lisi_send_Red_Package()));

    connect(this->lisi,SIGNAL(lisi_send_Red_Package()),this->zhangsan,SLOT(receive_Red_Package()));
    emit this->tea->Tea_send_Red_Package();//触发信号
}

Mydialog::~Mydialog()
{
    delete ui;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/299510.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenVINS学习6——VioManagerHelper.cpp,VioManagerOptions.h学习与注释

前言 VioManager类里还有VioManagerHelper.cpp,VioManagerOptions.h这两个文件&#xff0c;也包含了一些函数&#xff0c;这次接着看这个 。 整体分析 void VioManager::initialize_with_gt(Eigen::Matrix<double, 17, 1> imustate) 给一个状态&#xff0c;然后初始化…

基于YOLOv3开发构建道路交通场景下CCTSDB2021交通标识检测识别系统

交通标志检测是交通标志识别系统中的一项重要任务。与其他国家的交通标志相比&#xff0c;中国的交通标志有其独特的特点。卷积神经网络&#xff08;CNN&#xff09;在计算机视觉任务中取得了突破性进展&#xff0c;在交通标志分类方面取得了巨大的成功。CCTSDB 数据集是由长沙…

【Java】设计模式之两阶段终止

两阶段终止 两阶段终止&#xff0c;即Two Phase Termination。是用来终止线程的套路。 它的思想是&#xff0c;如何在一个线程T1中优雅地终止线程T2&#xff1f;这里的【优雅】指的是给T2一个料理后事的机会。 错误思路&#xff1a; 使用stop方法。stop 方法会真正杀死线程…

SpringMVC的工作流程

SpringMVC的工作流程图 SpringMVC的工作流程 1. 用户通过客户端向服务器发送请求&#xff0c;请求会被 SpringMVC的前端控制器DispatcherServlet所拦截。 2. DispatcherServlet拦截到请求后&#xff0c;会调用HandlerMapping处理器映射器。 3. 处理器映射器根据请求URL找到具…

HNU-数据库系统-实验4-存储过程与事务处理

数据库系统 课程实验4存储过程与事务处理 计科210X 甘晴void 202108010XXX 目录 文章目录 数据库系统 课程实验4<br>存储过程与事务处理实验目的实验环境实验准备表设计初始数据 实验内容4.1 存储过程实验实验内容与要求实验重点和难点实验过程&#xff08;0&#xff0…

八大算法排序@堆排序(C语言版本)

目录 堆排序大堆排序概念算法思想建堆建堆核心算法建堆的代码 排序代码实现 小堆排序代码实现时间复杂度空间复杂度 特性总结 堆排序 堆排序借用的是堆的特性来实现排序功能的。大堆需要满足父节点大于子节点&#xff0c;因此堆顶是整个数组中的最大元素。小堆则相反&#xff0…

【C程序设计】C指针

学习 C 语言的指针既简单又有趣。通过指针&#xff0c;可以简化一些 C 编程任务的执行&#xff0c;还有一些任务&#xff0c;如动态内存分配&#xff0c;没有指针是无法执行的。所以&#xff0c;想要成为一名优秀的 C 程序员&#xff0c;学习指针是很有必要的。 正如您所知道的…

功能强大且易于使用的视频转换软件—Avdshare Video Converter for Mac/win

在当今的数字时代&#xff0c;我们的生活离不开各种形式的媒体娱乐&#xff0c;而视频内容无疑是其中最为受欢迎的一种。然而&#xff0c;我们常常会遇到一些问题&#xff0c;比如我们在电脑上下载的视频无法在手机上播放&#xff0c;或是我们想将视频转换为其他格式以适应不同…

基于Redis + Lua脚本语言 + 注解:构建高效的请求接口限流方案

为什么接口限流 黑客疯狂请求系统接口的某一个接口 而且每次都需要数据库io操作 。如果并发量很大。导致的结果就是 宕机。 解决方案很多 今天我们就先来基于Redis Lua脚本语言 注解&#xff1a;构建高效的请求接口限流方案 限流效果 ~~~~连续点击 源码地址在最下面 lua安装…

JS事件循环

目录 概述1. 堆栈&#xff08;Call Stack&#xff09;2. 堆&#xff08;Heap&#xff09;3. 事件队列&#xff08;Event Queue&#xff09;4. 宿主环境&#xff08;Host Environment&#xff09; 事件循环&#xff08;Event Loop&#xff09;微任务和宏任务&#xff08;Microta…

[JavaWeb玩耍日记]JDBC(不常用)

项目结构 目录 一.快速入门 二.开启事务 三.sql执行对象的executeUpdate方法 四.查询数据库 五.SQL注入案例 六.使用PreparedStatement防止Sql注入 七.数据库连接池 一.快速入门 创建新项目&#xff0c;导入mysql-connector-java-5.1.48的jar包1.使用JDBC更新一条数据有…

【HarmonyOS】装饰器下的状态管理与页面路由跳转实现

从今天开始&#xff0c;博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”&#xff0c;对于刚接触这项技术的小伙伴在学习鸿蒙开发之前&#xff0c;有必要先了解一下鸿蒙&#xff0c;从你的角度来讲&#xff0c;你认为什么是鸿蒙呢&#xff1f;它出现的意义又是…

使用VS Code远程开发小游戏,并实现公网访问本地游戏

使用VS Code远程开发小游戏&#xff0c;并实现公网访问本地游戏 前言1. 编写MENJA小游戏2. 安装cpolar内网穿透3. 配置MENJA小游戏公网访问地址4. 实现公网访问MENJA小游戏5. 固定MENJA小游戏公网地址 前言 在本篇博客中&#xff0c;我们将分享如何通过VS Code实现远程开发MEN…

Java多态,包,权限修饰符,final关键字

文章目录 今日内容教学目标 第一章 多态1.1 多态的形式1.2 多态的使用场景1.3 多态的定义和前提1.4 多态的运行特点1.5 多态的弊端1.6 引用类型转换1.6.1 为什么要转型1.6.2 向上转型&#xff08;自动转换&#xff09;1.6.3 向下转型&#xff08;强制转换&#xff09;1.6.4 案例…

JWT 详解

前言&#xff1a; 本博客为转载整合博客&#xff08;主打一个&#xff1a;我们只做博客的搬运工&#xff09;&#xff0c;参考博客主要有&#xff1a; https://blog.csdn.net/weixin_45070175/article/details/118559272?ops_request_misc%257B%2522request%255Fid%2522%253A…

【LeetCode每日一题】383. 赎金信(计数模拟)

2024-1-7 文章目录 [383. 赎金信](https://leetcode.cn/problems/ransom-note/)思路&#xff1a;计数模拟 383. 赎金信 思路&#xff1a;计数模拟 1.通过数组对字母进行计数 2.magazine 中的每个字符只能在 ransomNote 中使用一次。 3.判断减一后&#xff0c;是否小于等于0。…

前端ui库搜集

涟漪动画效果 - MDUI 开发文档, Material Design 前端框架添加涟漪动画效果后&#xff0c;会在点击元素时&#xff0c;产生向外扩散的水波纹效果。https://www.mdui.org/docs/ripple#ripple https://semantic-ui.com/ https://getuikit.com/ https://www.purecss.cn/grids.htm…

Linux进程间通讯 -- 管道

Linux进程间通讯 – 管道 文章目录 Linux进程间通讯 -- 管道1. 原理2. 进程间通讯2.1 管道2.1.1 匿名管道 pipe2.2.2 有名管道 FIFO 2.2 信号2.3 共享内存2.4 本地套接字 1. 原理 Linux 进程间通讯&#xff0c;也称为IPC(InterProcess Communication) 在 Linux 中每个进程都具…

Doris初识(01)

Doris初识 初识 Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库&#xff0c;以极速易用的特点被人们所熟知&#xff0c;仅需亚秒级响应时间即可返回海量数据下的查询结果&#xff0c;不仅可以支持高并发的点查询场景&#xff0c;也能支持高吞吐的复杂分析场景…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux系统编程第三天-Linux进程(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666_嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机…