QSignalMapper

本文主要根据QT官方帮助文档以及日常使用,简单的介绍一下QSignalMapper的功能以及使用

简介

QSignalMapper是一个将已知发射对象和信号绑定在一起的类。通过看帮助文档中的内容,其主要的作用是将一个无参信号绑定一个参数,然后再将这个信号加上这个参数转发出去。

应用场景一般是:你有一些信号,这些信号对应的槽函数内容都差不多,最简单的方法是给每一个信号都连接一个槽函数。但这样做,会让代码多一些不必要的复杂,这种情况下,你就可以使用QSignalMapper

使用方法

根据官方文档中的例子,使用的方法是:

QSignalMapper *mapper = new QSignalMapper(this);
QStringList buttonText = {"button", "button_2", "button_3"}; for (int i = 0; i < buttonText.size(); i++) {
QPushButton *button = new QPushButton(this);
// 1. 把要转发的信号和QSignalMapper的map信号进行连接
connect(button, &QPushButton::clicked, mapper, &QSignalMapper::map);
// 2. 设置信号的映射关系
mapper->setMapping(button, buttonText.at(i));
} // 3. 将QSignalMapper的转发信号连接起来
connect(mapper, QOverload<const QString &>::of(&QSignalMapper::mapped),
[const QString &text] () {
qDebug() << text;
});

这个方法在QT引入lambda作为槽函数之前,确实是一个好的方法。但是引入了lambda之后,就可以像下面这样,用lambda函数写,更加的方便。

QSignalMapper *mapper = new QSignalMapper(this);
QStringList buttonText = {"button", "button_2", "button_3"}; for (int i = 0; i < buttonText.size(); i++) {
QString text = buttonText.at(i);
QPushButton *button = new QPushButton(this);
connect(button, &QPushButton::clicked, [=] () {
qDebug() << text;
});
}

主要的函数

  1. setMapping(设置对象和转发参数的映射关系)

    该函数的原型为:

    void setMapping(QObject *sender, int id);
    void setMapping(QObject *sender, QString text);
    void setMapping(QObject *sender, QWidget *widget);
    void setMapping(QObject *sender, QObject *object);

    作用是设置对象和转发参数的映射关系,也就是设置对象的信号转发之后,重新发射的信号所带的参数。

  2. removeMappings(删除指定对象的映射关系)

    该函数的原型为:

    void removeMappings(QObject* sender);

    作用是移除指定对象信号的映射关系。

  3. mapping(获取对象和转发参数的映射关系)

    函数原型为:

    QObject * mapping(int id) const
    QObject * mapping(const QString &id) const
    QObject * mapping(QWidget *widget) const
    QObject * mapping(QObject *object) const

    该函数的作用是,根据转发的参数,来获取对应的对象。

信号和槽

槽函数

  1. map

    函数原型为:

    void map(QObject *sender)
    void map()

    带参数的这个map函数,是会发射sender这个对象所映射的信号。而不带参数的这个map函数会根据槽函数所连接的信号,来发射对应的带参数的信号。

信号

  1. mapped

    函数的原型为:

    void mapped(QObject *object)
    void mapped(QWidget *widget)
    void mapped(const QString &text)
    void mapped(int i)

    这个信号,是根据对象所绑定的参数,来决定发射信号的参数
    因为这个信号是重载的函数,如果需要用函数指针的方式来连接信号的话:

    connect(mapper, QOverload<const QString &>::of(&QSignalMapper::mapped),
    [const QString &text] () {
    qDebug() << text;
    });

[Qt基础-07 QSignalMapper]的更多相关文章

  1. 基于C/S架构的3D对战网络游戏C++框架 _04客户端详细设计与OpenGL、Qt基础

    本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...

  2. javaSE基础07

    javaSE基础07 一.static静态修饰符 用了static修饰的变量就会变成共享的属性,只会初始化一次,在内存中只存在一个,并且每个对象都可以访问,存放在方法区(数据共享区) 1.1 stat ...

  3. javascript基础07

    javascript基础07 1.节点 元素.childNodes : 属性 只读 属性 子节点列表集合 元素.childNodes 只包含子节点,不包含孙节点 DOM节点的类型有很多种,w3c标准有 ...

  4. Qt基础——让使用Designer创建的UI也能自动适应窗口大小

    原文请看:http://www.cnblogs.com/linmeng/archive/2012/07/05/2559259.html 我们知道,通过Qt的各种Layout可以实现控件的自动布局. 但 ...

  5. QT 巧用QSignalMapper分类有序地处理大量信号

    转自--> http://blog.csdn.net/cuteqt/article/details/4306900 QSignalMapper这个类并不是个新鲜概念, 早在Qt2里就已经存在, ...

  6. C++ Qt基础知识

    时间如流水,只能流去不流回. 学历代表你的过去,能力代表你的现在,学习能力代表你的将来. 学无止境,精益求精. 记录C++ Qt的基础知识学习记录 <C++ Qt设计模式(第二版)>

  7. qt基础知识之类库概述

    qt是用标准c++编写的跨平台开发类库,它对标准c++进行拓展,引入元对象系统.信号&槽.属性等特征 全局定义 容器类及对应迭代器 qt的模块化体系,分为 基本模块和拓展模块,一个模块通常就是 ...

  8. C/C++ Qt 基础通用组件应用

    QT 是一个跨平台C++图形界面开发库,利用QT可以快速开发跨平台窗体应用程序,在QT中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率. 目前,QT开发中常用的基础 ...

  9. [Qt基础内容-08] Qt中MVC的M(Model)

    Qt中MVC的M(Model)简单介绍 Qt有自己的MVC框架,分别是model(模型).view(视图).delegate(委托),这篇文章,简单的介绍以下Qt中有关model(模型)的类以及一些基 ...

  10. Qt基础之开发环境部署

    将 Qt 5.6 集成至 VS2015 摘要: 由于VS2015不再支持addin,所以要用其他手段. 这里给出64位系统下的安装步骤,32位类似. 一.安装VS2015 过程略.值得注意的是要选择需 ...

随机推荐

  1. 在linu系统安装apache全过程(httpd、apr、apr-util、pcre)以及进行相应配置

    1.下载安装包,需要下面3个安装包[root@bes2 apache]# ll总用量 8520-rw-r--r--. 1 root root 1020833 9月 18 17:47 apr-1.5.1 ...

  2. SpringBoot支持Kafka多源配置的同时还要支持启停配置化,是真的会玩

    开心一刻 今早,女朋友给我发微信 她:宝贝,你要记住 她:我可是你女朋友,你相亲就亲,想抱就抱 她:不要老是问我,男生要主动一些 我:可是你上次报警可不是这么说的 基础回顾 Spring Boot 集 ...

  3. Qt编写安防视频监控系统62-子模块6预置位

    一.前言 预置位功能,只对带有预置位的球机才起作用,有云台的球机未必有预置位,要仔细查看清楚,不清楚可以询问厂家或者查阅手册,在本模块中,可以获取预置位.添加预置位.调用预置位.删除预置位.调用起始位 ...

  4. Windows下用CMake构建和编译第三方依赖库并向C:\Program Files\或C:\Program Files (x86)\目录下安装编译好的静态库(.lib)和动态链接库(.dll)时的步骤和注意事项

    从CMake构建和编译第三方依赖库的步骤: 1.下载第三方依赖库的源码,并解压到指定的目录中. 2.在第三方依赖库的的源码所在的目录下(一般是src/目录下)创建一个文件夹build. 3.打开CMa ...

  5. 即时通讯技术文集(第31期):IM开发综合技术合集(Part4) [共13篇]

    为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第31 期. ​[- 1 -] IM消息ID技术专题(一):微信的海量IM聊天消息序列号生成实践 ...

  6. Transformers in Vision

    Transformers in Vision 介绍 最初引入现在著名的Attention is all you need1,Transformer 多年来一直主导着自然语言处理 (NLP) 领域.特别 ...

  7. 状压 DP 做题记录

    1.普通状态压缩 DP oi-wiki I.P1896 [SCOI2005] 互不侵犯 \(f_{i,j,st}\) 表示前 \(i\) 行中放置了 \(j\) 个国王,当前行状态为 \(st\) 的 ...

  8. Ellyn-Golang调用级覆盖率&方法调用链插桩采集方案

    词语解释 Ellyn要解决什么问题? 在应用程序并行执行的情况下,精确获取单个用例.流量.单元测试走过的方法链(有向图).出入参数.行覆盖等运行时数据,经过一定的加工之后,应用在覆盖率.影响面评估.流 ...

  9. 深度学习基础理论————DeepSpeed

    DeepSpeed原理 DeepSpeed 是由微软开发的一种深度学习优化库,专为高性能训练和推理而设计,尤其适用于大规模深度学习模型(如 GPT 系列.BERT 等).它通过一系列技术和优化策略,帮 ...

  10. c# 免注册调用大漠插件100%完美识别文字

    c# 免注册调用大漠插件100%完美识别文字 下载:https://download.csdn.net/download/xxq931123/10875122 绑定 模式:http://zy.anji ...