信号和槽机制

2023-11-11

1.信号和槽机制概念

信号:各种事件

: 响应信号的动作

当某个事件发生后,如某个按钮被点击了一下,它就会发出一个被点击的信号(signal)

某个对象接收到这个信号之后,就会做一些相关的处理动作(称为槽slot)。

但是Qt对象不会无故收到某个信号,要想让一个对象收到另一个对象发出的信号,这时候需要建立连接(connect)

    需求:

    信号发送者
    信号
    信号接收者
    槽:信号的处理动作
    默认情况下,它们四者没有关系,通过connect 建立四者的关系

例:    

    按钮
    被点击
    窗口
    关闭
    
    建立四者的关系(按钮 被点击 窗口 关闭)

信号与槽关联是用 QObject::connect() 函数实现的,其基本格式是:
QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));

2.类型

A.系统自带的信号和槽

下面我们完成一个小功能,上面我们已经学习了按钮的创建,但是还没有体现出按钮的功能,按钮最大的功能也就是点击后触发一些事情,比如我们点击按钮,就把当前的窗口给关闭掉,那么在Qt中,这样的功能如何实现呢?

其实两行代码就可以搞定了,我们看下面的代码

  QPushButton * quitBtn = new QPushButton("关闭窗口",this);

  connect(quitBtn,&QPushButton::clicked,this,&MyWidget::close);

第一行是创建一个关闭按钮,这个之前已经学过,第二行就是核心了,也就是信号槽的使用方式

注:

  connect(btn,&QPushButton::clicked,this,&Widget::hide);

   使用connect的时候保留&符号,不使用也是默认地址
    1 提高代码可读性
    2 自动提示

应用函数:

connect函数是建立信号发送者、信号、信号接收者、槽四者关系的函数:

connect(sender, signal, receiver, slot);

参数解释

  1. sender:信号发送者
  2. signal:信号
  3. receiver:信号接收者
  4. slot:接收对象在接收到信号之后所需要调用的函数(槽函数)

这里要注意的是connect的四个参数都是指针,信号和槽是函数指针

系统自带的信号和槽如何查找呢,这个就需要利用帮助文档了,在帮助文档中比如我们上面的按钮的点击信号,在帮助文档中输入QPushButton,首先我们可以在Contents中寻找关键字 signals,信号的意思,但是我们发现并没有找到,这时候我们应该想到也许这个信号的被父类继承下来的,因此我们去他的父类QAbstractButton中就可以找到该关键字,点击signals索引到系统自带的信号有如下几个

 这里的clicked就是我们要找到,槽函数的寻找方式和信号一样,只不过他的关键字是slot。

B.自定义信号和槽

1.自定义信号和槽

Qt框架默认提供的标准信号和槽不足以完成我们日常应用开发的需求,比如说点击某个按钮让另一个按钮的文字改变,这时候标准信号和槽就没有提供这样的函数。但是Qt信号和槽机制提供了允许我们自己设计自己的信号和槽

多个信号可连一个槽,一个槽可连多个信号,一个信号可连接另一个信号

定义信号:只声明不定义

定义槽: 要声明要定义

 

 

连接

先声明

实例化和连接

 

发送信号

2.自定义信号使用条件

  1. 声明在类的signals域下
  2. 没有返回值,void类型的函数
  3. 只有函数声明,没有定义
  4. 可以有参数,可以重载
  5. 通过emit关键字来触发信号,形式:emit object->sig(参数);

3.自定义槽函数使用条件

  1. qt4 必须声明在 private/public/protected slots域下面,qt5之后可以声明public下,同时还可以是静态的成员函数,全局函数,lambda表达式
  2. 没有返回值,void类型的函数
  3. 不仅有声明,还得要有实现
  4. 可以有参数,可以重载

4.使用自定义信号和槽

定义场景:下课了,老师跟同学说肚子饿了(信号),学生请老师吃饭(槽)

首先定义一个学生类和老师类:

老师类中声明信号 饿了 hungry

signals:

       void hungry();

学生类中声明槽 请客treat

public slots:

       void treat();

在窗口中声明一个公共方法下课,这个方法的调用会触发老师饿了这个信号,而响应槽函数学生请客

void MyWidget::ClassIsOver()

{

    //发送信号

    emit teacher->hungry();

}

学生响应了槽函数,并且打印信息

//自定义槽函数 实现

void Student::treat()

{

       qDebug() << "Student treat teacher";

}

在窗口中连接信号槽

    teacher = new Teacher(this);

    student = new Student(this);

    connect(teacher,&Teacher::hungury,student,&Student::treat);

并且调用下课函数,测试打印出相应log

自定义的信号 hungry带参数,需要提供重载的自定义信号和 自定义槽

void hungry(QString name);  自定义信号

void treat(QString name );    自定义槽

但是由于有两个重名的自定义信号和自定义的槽,直接连接会报错,所以需要利用函数指针来指向函数地址, 然后在做连接

void (Teacher:: * teacherSingal)(QString) = &Teacher:: hangry;

void (Student:: * studentSlot)(QString) = &Student::treat;

connect(teacher,teacherSingal,student,studentSlot);

也可以使用static_cast静态转换挑选我们要的函数

connect(

teacher,

static_cast<void(Teacher:: *)(QString)>(&Teacher:: hangry),

student,

static_cast<void(Student:: *)(QString)>(& Student::treat));

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

信号和槽机制 的相关文章

  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile

随机推荐

  • 基于UDP实现简易聊天

    概述 UDP没有创建连接 数据包是一次收发一个 没有流的概念 但是在UDP编程中需要用到的是Socket 因为应用程序在使用UDP时必须指定网络接口 IP地址 和端口号 服务器端 在服务器端 使用UDP也需要监听指定的端口 Java提供了D
  • OTSU算法 (大津算法)理解&代码

    OTSU算法 对图像进行二值化的算法 介绍 OTSU算法是一种自适应的阈值确定的方法 又称大津阈值分割法 是最小二乘法意义下的最优分割 它是按图像的灰度特性 将图像分成背景和前景两部分 因方差是灰度分布均匀性的一种度量 背景和前景之间的类间
  • SpringBoot的yml文件中map,对象,list的嵌套使用

    ems ems real ip map 127 0 0 110 Huawei NCE OTN 127 0 0 33 Huawei NCE ROADM ems collect config map Huawei NCE OTN host 12
  • PTA 求最大、次大和第3大的值 (25 分)

    本题目要求读入n个整数 要求用最少的比较次数 输出它们的最大值 第2大的值和第3大的值 例如 对于13 13 1 10 34 10这6个数 最大值为34 第2大的值为13 第3大的值为10 输入格式 输入有两行 第一行为整数个数n 1 00
  • Redis多数据中心复制管理系统—— X-Pipe

    Redis多数据中心复制管理系统 X Pipe Redis 在携程内部得到了广泛的使用 根据客户端数据统计 整个携程全部 Redis 的读写请求在每秒 200W 其中写请求约 10W 很多业务甚至会将 Redis 当成内存数据库使用 这样
  • 基于51单片机实现继电器控制照明设备(Proteus仿真)

    wechat 嵌入式工程师成长日记 具体功能实现 当按下开关时 继电器闭合点亮照明设备 灯泡 使用器件 照明设备 LAMP 按键 AT89C51 若干电阻 PNP晶体管 二极管 继电器 RTE24005F Proteus仿真原理图 仿真 知
  • C++字符串【string】和【char []】操作全攻略

    异想之旅 本人原创博客完全手敲 绝对非搬运 全网不可能有重复 本人无团队 仅为技术爱好者进行分享 所有内容不牵扯广告 本人所有文章仅在CSDN 掘金和个人博客 一定是异想之旅域名 发布 除此之外全部是盗文 一 char 类型 1 定义与输入
  • Linux_18.04 Failed to load module "canberra-gtk-module"

    解决办法 sudo apt install libcanberra gtk module
  • openGL之API学习(二十六)glTexImage2D

    给2维纹理分配显存空间 也可以从内存向显存拷贝数据 void glTexImage2D GLenum target GLint level GLint internalformat GLsizei width GLsizei height
  • 你需要知道的 Selenium4 新特性

    前言 最近又用到了Selneium 发现已经来到了 4 9 版本了 本篇文章来介绍下它较比 Selenium3 的一些新特性 记录下 当是做笔记了 最令人惊喜的是 Selenium4 会自动回收浏览器资源 本文所使用的 Selenium 版
  • linux常用命令及解释大全(一)

    目录 一 系统信息 二 关机 重启及登出 三 文件和目录 3 1 导航命令 3 2 查看命令 3 3 创建和删除命令 3 4 复制和链接命令 3 5 其他命令 四 文件搜索 五 挂载文件系统 六 磁盘空间 七 用户和群组 总结 前言 Lin
  • js 拦截alert对话框

  • 若依框架前后端分离版——导入功能

    引言 主要是记录自己使用若依框架并增加其导入功能的实现过程 前端部分 在相应的index vue中添加以下代码 1 数据导入的按钮 v hasPermi 是权限相关的配置
  • Git版本回退并提交远程

    1 进入远程git 在提交纪录中找到需要回退的版本 复制版本号 2 终端进入项目 并执行git reset hard 23a50a1fXXX41XXXXX0227 3 把修改推送至远程 执行已下指令 git push f u origin
  • thrift开发问题总结

    作为目前最流行的RPC框架 thrift不仅提供了通信协议 同时提供了网络框架 解脱了程序员的生产力 thrift也是阿帕奇Hadoop系列的RPC实现工具 本文主要聚焦在实现的thrift系统中 遇到的各种问题 但是thrift在隐藏一些
  • matlab 矩阵增加行,MATLAB 中 如何在矩阵中插入1行

    点击查看MATLAB 中 如何在矩阵中插入1行具体信息 答 举例来说吧假如你已有矩阵A如下 A 2 3 5 3 4 1 0 9 7 这是一个3 3矩阵 那么当你想插入一行r 1 2 3 时 那么可以这样做 A A r 这样A就变成了4 3的
  • Gin框架(学习笔记)

    目录 学习地址 gin 路由 routes group gin 中间件 Cookie 重定向 同步异步 日志文件 学习地址 https www topgoer com gin E6 A1 86 E6 9E B6 gin 路由 package
  • windows操作系统蓝屏错误对照表

    windows操作系统蓝屏错误对照表
  • 出行行业计价模块的设计模式实践

    业务场景介绍 在出行行业中 价格的配置随随着业务的增加而增加 而刺激出行的促销活动更是频繁 在价格的计算中 通常的流程如下 根据一组价格配置 计算订单基础的价格 根据用户拥有的优惠对象 例如优惠券 积分 会员级别等 计算出优惠以后的价格 计
  • 信号和槽机制

    1 信号和槽机制概念 信号 各种事件 槽 响应信号的动作 当某个事件发生后 如某个按钮被点击了一下 它就会发出一个被点击的信号 signal 某个对象接收到这个信号之后 就会做一些相关的处理动作 称为槽slot 但是Qt对象不会无故收到某个