Qt 多个信号关联同一个槽函数

2023-11-01

背景:多个信号需要执行同一个函数或者一类函数的时候,可以选择每个信号创建一个槽函数去实现功能,如果直接关联到一个函数中,该函数只能执行一份功能,有时候并不能满足业务需求

在多个信号绑定到同一个槽函数的状态下,让槽函数根据绑定的不同的信号执行不同的功能有两种方法:

(1)在槽函数中获取到sender对象,反向解析出信号的名称,分叉执行;

(2)使用QSingalMapper类:管理多个信号,槽函数的处理相对变得简单。

具体来看:

(1)反向获取Sender名称

关键函数:

1 QObject::sender()                  // 在槽函数中获取信号
2 QObject::setObjectName(QString)    // 给QObject对象设置名称
3 QObject::objectName()              // 获取QObject对象名称
4 QObject_cast<QObject>(object)      // 强转对象类型

思路如下:

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

示例代码如下:

 1 typedef enum{
 2 BUTTON_1,
 3 BUTTON_2,
 4 BUTTON_3,
 5 BUTTON_4
 6 }BUTTON;
 7  
 8  push_button_1->setObjectName(QString::number(BUTTON_1, 10));
 9  push_button_2->setObjectName(QString::number(BUTTON_2, 10));
10  tool_button_1->setObjectName(QString::number(BUTTON_3, 10));
11  tool_button_2->setObjectName(QString::number(BUTTON_4, 10));
12  connect(push_button_1, &QPushButton::clicked, this, &MyWidget::changeButton);
13  connect(push_button_2, &QPushButton::clicked, this, &MyWidget::changeButton);
14  connect(tool_button_1, &QToolButton::clicked, this, &MyWidget::changeButton);
15  connect(tool_button_2, &QToolButton::clicked, this, &MyWidget::changeButton);
16  
17 void MyWidget::changeButton()
18 {
19     QObject *object = QObject::sender();
20     QPushButton *push_button = qobject_cast<QPushButton *>(object);
21     QToolButton *tool_button = qobject_cast<QToolButton *>(object);
22     int index;
23     if(push_button)
24     {
25         QString object_name = push_button->objectName();
26         index = object_name.toInt();
27     }
28     else if(tool_button )
29     {
30          QString object_name = tool_button->objectName();
31          index = object_name.toInt();
32     }
33  
34     QString information = QString("");
35     switch(index)
36     {
37     case BUTTON_1:
38         information = QString("clicked 1");
39         break;
40  
41     case BUTTON_2:
42         information = QString("clicked 2");
43         break;
44  
45     case BUTTON_3:
46         information = QString("clicked 3");
47         break;
48  
49     case BUTTON_4:
50         information = QString("clicked 4");
51         break;
52  
53     default:
54         information = QString("which is clicked?");
55         break;
56     }
57     QMessageBox::information(NULL, QString("Title"), information);
58 }

( 2 ) 使用QSignalMapper类

这个思想是:希望能够在信号关联中直接传递一个参数!直接用信号槽无法实现

QSignalMapper类内置了一个Map表,将Singnal和参数对应起来,然后多个信号关联到Mapper上,由mapper负责管理,并且mapper关联到槽函数中,将对应的参数传入槽函数

这个流程图如下:

 

实例代码如下:

 1 QSignalMapper *signal_mapper = new QSignalMapper(this);
 2 connect(push_button_1, &QPushButton::clicked, signal_mapper, &QSignalMapper::map);
 3 connect(push_button_2, &QPushButton::clicked, signal_mapper, &QSignalMapper::map);
 4 connect(tool_button_1, &QToolButton::clicked, signal_mapper, &QSignalMapper::map);
 5 connect(tool_button_2, &QToolButton::clicked, signal_mapper, &QSignalMapper::map);
 6  
 7 signal_mapper->setMapping(push_button_1, QString::number(BUTTON_1, 10));
 8 signal_mapper->setMapping(push_button_2, QString::number(BUTTON_2, 10));
 9 signal_mapper->setMapping(tool_button_1, QString::number(BUTTON_3, 10));
10 signal_mapper->setMapping(tool_button_2, QString::number(BUTTON_4, 10));
11 connect(signal_mapper, &QSignalMapper::mapped, this, &MyWidget::changeButton);
12  
13 void MyWidget::changeButton(QString text)
14 {
15     int index = text.toInt();
16     QString information = QString("");
17     switch(index)
18     {
19     case BUTTON_1:
20         information = QString("clicked 1");
21         break;
22  
23     case BUTTON_2:
24         information = QString("clicked 2");
25         break;
26  
27     case BUTTON_3:
28         information = QString("clicked 3");
29         break;
30  
31     case BUTTON_4:
32         information = QString("clicked 4");
33         break;
34  
35     default:
36         information = QString("which is clicked?");
37         break;
38     }
39     QMessageBox::information(NULL, QString("Title"), information);
40 }
41 20/article/details/81016424

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

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

Qt 多个信号关联同一个槽函数 的相关文章

  • 如何在不声明 32 个插槽的情况下将 32 个按钮的 pressed() 信号连接到单个函数?

    我有一个小部件 里面有 32 个按钮 我需要将每个按钮的 Pressed 信号连接到一个插槽 以便调用一个函数 该函数的参数取决于我按下的按钮 现在我通过以 on QPushButtonName pressed 的形式添加 32 个插槽来做
  • 如何安装 C++ 的 VOCE?

    我正在尝试安装 VOCE api 它是为 C 和 Java 构建的语音识别 API 这是我第二次使用外部 C 库 也是第一次使用 Java C api 语音链接 http voce sourceforge net http voce sou
  • Qt 多重继承和信号

    由于 QObject 我在 QT 中遇到了有关多重继承的问题 我知道很多人也有同样的问题 但我不知道该如何解决 class NavigatableItem public QObject Q OBJECT signals void desel
  • 使用 qt 创建和使用共享库

    我对共享库很陌生 所以我对如何创建 使用共享库有疑问 我正在使用 Qt Creator 和 qt 5 4 2 以及 Microsoft Visual C 11 0 编译器 在我的项目中 我需要创建一个 dll 它从外部库调用函数 有 h l
  • Android 上与 Qt 5.2 的蓝牙通信[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想使用 Qt 框架使我的 Android 设备能够通过蓝牙进行通信 截至今天 Qt 5 2 是最新的 据我所知 尚不支持蓝牙 在本页
  • 通过信号/槽将 QVector 从工作线程传递到主线程

    目前 我在将 QVector 传递到线程之间时遇到一些麻烦 目前我有一个主线程 GUI Thread 和一个频繁发出 QVector 数组的工作线程 在向量内直接发出数据之前看起来不错 接收者是主线程中的一个槽 但该槽接收到的数据是乱码 这
  • 仅使 QTreeWidgetItem 的一列可编辑

    我有一个QTreeWidgetItem有两列数据 有什么办法可以只让第二列可编辑吗 当我执行以下操作时 QTreeWidgetItem item new QTreeWidgetItem item gt setFlags item gt fl
  • QImage 转换为 QML

    我的应用程序通过网络接收 JPEG 实时流 每秒 16 帧 直播流应使用 QML 显示 接收部分是用C 编写的 所有UI都是用QML编写的 如何将图像数据输入 QML 窗口 我已经研究过如何显示 QImage 但还没有找到解决方案 实现 Q
  • 如何释放Qthread对象的内存?

    我做过这样的事情 in the mainwindow s constructor QThread thr new QThread soundWorker work new soundWorker connect this SIGNAL pl
  • Qt 要包含哪些标头?

    使用 Qt 使用 C 进行编程时 我应该包含哪些内容 仅包含 2 个 include
  • 如何使用 C++ 更新 QML 文本

    我有一个小问题 有人可以告诉我如何从 C 更新 qml 文本吗 我有一个使用线程的示例 但我不想应用此方法 因为我不知道如何设置 run 函数中的参数 要完全理解我 这里是我的代码 在启动线程时的主函数中 我想放置自定义文本或具有文本的字符
  • 超越堆栈采样:C++ 分析器

    黑客的故事 日期是 2010 年 2 月 12 日 圣诞节前的日子已经过去了 作为一名 Windows 程序员 我几乎遇到了一个主要障碍 我一直在使用 AQTime 我尝试过 sleepy shiny very sleepy 就在我们说话的
  • 如何防止 QTableView 项目在双击时被清除

    使用 QAbstractTableModel 将 QTableView 设置为可编辑flag method def flags self index return Qt ItemIsEnabled Qt ItemIsSelectable Q
  • 如何将 qmake 转换为 cmake?

    我有一个 pro我的项目上的文件 但现在我想将其移植到CMakeLists txt文件 我怎样才能做到这一点 QT core QT gui CONFIG c 11 TARGET test CONFIG console CONFIG app
  • QTextEdit:仅当滚动条位于底部时自动向下滚动

    有一个 QTextEdit 显示相当多的文本 它不可编辑 假设我想在开头阅读一些内容 向上滚动 但随后添加了一个新行 并且滚动条自动转到底部 我在使用各种程序时遇到类似的问题 无论它们是用什么语言编写的 如何处理这个问题 当向文本添加新行时
  • QTreeView绘制下降指示器

    我需要在 QTreeView 中通过拖放实现行移动 并显示行之间的放置指示器 我想知道是否有一种方法可以覆盖指示器绘制 因此它仅针对行之间的所有层次结构级别显示 而不是项目周围的矩形 该线必须与整行一样宽 而不是与一列一样宽 可以通过修改用
  • 如何检查QProcess是否正确执行?

    QProcess process sdcompare QString command sdcompare QStringList args sdcompare command sdcompare diff args sdcompare lt
  • Qt:如何制作二维插值颜色字段?

    我是 C 的初学者 尤其是与图形相关的 我想为我的图形视图制作一个动画背景 如下所示 梯度场气流 http www engineering leeds ac uk cfd research images untitled JPG 该图片表现
  • Qt jpg图像显示

    我想在 Qt UI 中显示 jpg 图像 我上网查了一下 发现https doc qt io archives qt 4 8 qt widgets imageviewer example html https doc qt io archi
  • Qt: 主窗口->show();不显示主窗口

    在下面的代码中 我创建一个窗口 调用window show 但窗口直到之后才显示window gt iterateSolution 叫做 几乎就好像 app exec 是显示窗口的函数 我对 Qt 很陌生 所以我不知道发生了什么 inclu

随机推荐

  • Selenium下Chrome配置 (含启动无痕界面--无界面浏览器)

    转载 https www cnblogs com kaibindirver p 11432850 html Selenium下Chrome配置 含启动无痕界面 无界面浏览器 例子 设置无界面模式浏览器启动 chrome options we
  • MapReduce shuffle过程详解

    一 MapReduce计算模型 我们知道MapReduce计算模型主要由三个阶段构成 Map shuffle Reduce Map是映射 负责数据的过滤分法 将原始数据转化为键值对 Reduce是合并 将具有相同key值的value进行处理
  • OpenMV4开发笔记4-舵机控制

    OpenMV4的舵机控制脚有3个 P7 P8 P9 即可以控制3个舵机 Servo 1 gt P7 PD12 Servo 2 gt P8 PD13 OpenMV3 M7 OpenMV4 H7上增加 Servo 3 gt P9 PD14 注意
  • 论EI、SCI和ISTP检索论文的收录号和期刊号查询方法

    http www scitsg com Article 134240802101541 aspx 需要申请博士后进站和国家自然科学基金的朋友都知道申请博士后进站和国家自然科学基金需要填写很多申请表格 其中就需要填写所发表的EI SCI和IS
  • Activiti 流程引擎之流程任务创建、部署流程、流程任务启动、查看当前任务、完成当前任务

    1 流程任务创建 1 在项目中创建diagram文件夹 并创建Activiti Diagram文件MyProcess bpmn 2 创建MyProcess bpmn 流程 详情如下 整体结构示意图 右击diagram文件夹 新建一个Acti
  • 折半查找——(递归,非递归C语言实现)

    折半查找 基本概念 1 折半查找 对半查找 二分查找 a 在 有序表 假设为递增 lt 先排序 gt 中 取中间记录作为比较对象 b 若给定值与中间记录相等 则查找成功 若给定值小于中间记录 则在有序表的左半区继续查找 若给定值大于中间记录
  • Redis 常见数据类型的使用场景以及底层结构

    前言 Redis 是一种基于内存的高性能的键值存储系统 支持多种数据类型 持久化 高可用集群等 在 Redis 中 每种数据类型都有自己独特的底层实现方式 这些实现方式直接影响着 Redis 的性能 本文将介绍 Redis 各种数据类型的使
  • docker 升级php7.3,docker容器如何升级

    解决方法 1 升级Image 只要从服务器拉下来最新的数据就行了 docker pull quay io sameersbn redmine latest 2 关闭旧容器并删除 到工作目录 data 使用 docker compose 来关
  • Unity Shader入门精要之第5 章 开始Unity Shader 学习之旅

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 一 5 1 本书使用的软件和环境 5 2 一个最简单的顶点 片元着色器 5 2 1 顶点 片元着色器的基本结构 参考 前言 欢迎来到本书的第 2 篇 初级篇 在基础篇中 我们学
  • HTML框架与内联框架

    目录 实例 框架 框架标签 Frame 基本的注意事项 有用的提示 更多实例 添加 iframe 的语法 Iframe 设置高度和宽度 实例 Iframe 删除边框 实例 使用 iframe 作为链接的目标 实例 HTML iframe 标
  • elasticsearch基础 学习笔记

    1 初识elasticsearch 1 1 什么是elasticsearch elasticsearch是一款非常强大的开源搜索引擎 可以帮助我们从海量数据中快速找到需要的内容 elasticsearch结合kibana Logstash
  • 8天学通MongoDB——第一天 基础入门

    关于mongodb的好处 优点之类的这里就不说了 唯一要讲的一点就是mongodb中有三元素 数据库 集合 文档 其中 集合 就是对应关系数据库中的 表 文档 对应 行 一 下载 上MongoDB官网 我们发现有32bit和64bit 这个
  • 华为od机试 python【计算玩牌最高得分】

    前言 Java 版本 链接 题目 代码 def calculate max score scores n len scores best scores 0 n for i
  • 一文总结Python数字图像处理基础知识与前沿应用

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 介绍 数字图像处理由涉及在计算机上处理图像的各种技术和方法组成 对图像进行各种类型的操作 构成数字图像处理 了解图像实际上是什么 图像基本上是二维信号 信号函数是 f x
  • 用vbs往服务器发送文件,[转] Windows 下命令行/VBS脚本,发送带附件邮件.

    利用VBScript发送邮件 以前从网上找的代码 不知原来的出处了 也不知作者是何人 挺有用的脚本 我就一直在使用这个脚本来发邮件 还可以带附件 放在这里做个备份 免得到时又找不到了 目前我就通过批处理配合这个脚本来自动备份我的一些文件到邮
  • 安装部署vCenter 6.7

    安装部署vCenter 6 7 一 下载vCenter6 7 下载地址 点击下载 更多下载地址 点击跳转 二 安装部署vCenter6 7 将下载好的镜像文件拷贝到一台windows机器上 并挂载到光驱 安装vCenter 双击运行 ins
  • 设计模式---------单例模式

    前言 单例模式 顾名思义就是只有一个实例 并且其负责创建自己的对象 这种类型的设计模式属于创建型模式 它提供了一种创建对象的最佳方式 这种模式涉及到一个单一的类 该类负责创建自己的对象 同时确保只有单个对象被创建 这个类提供了一种访问其唯一
  • 关系数据库——关系

    1 关系的性质 每个属性都必须是不可再分的数据项 每个属性都具有相同的数据类型 关系中不允许出现相同的属性名 关系中不允许有完全相同的元组 关系中元组的次序无关紧要 关系中属性的次序无关紧要 2 关系运算 传统的关系运算 并 交 差 笛卡尔
  • QT---信号与槽(3)

    目录 一 打印输出文本的编辑 二 补充QT4信号与槽函数的写法 三 信号与槽的总结 一 打印输出文本的编辑 PS更正 去掉打印输出中的空格 space更正为nospace void Student treat QString food QS
  • Qt 多个信号关联同一个槽函数

    背景 多个信号需要执行同一个函数或者一类函数的时候 可以选择每个信号创建一个槽函数去实现功能 如果直接关联到一个函数中 该函数只能执行一份功能 有时候并不能满足业务需求 在多个信号绑定到同一个槽函数的状态下 让槽函数根据绑定的不同的信号执行