QSignalMapper信号映射器的使用

2023-11-10


QSignalMapper介绍

该类收集一组无参数的信号,并使用与发送信号的对象对应的整数、字符串或对象参数重新发出它们。在大多数情况下,可以使用lambdas将自定义参数传递给槽。这样成本更低,并且可以简化代码。

该类支持使用setMapping()将特定字符串、整数、对象和小部件映射到特定对象。
然后,对象的信号可以连接到map()插槽,该插槽将发出一个与原始信号对象相关的值的信号(可以是mappedInt()mappedString()mappedObject())。最后可以使用removemaps()删除映射。

Signal 信号

该类主要有以下三个信号可以进行绑定,这取决于你使用setMapping()时传入的标识类型。

 void mappedInt(int i)
 void mappedObject(QObject *object)
 void mappedString(const QString &text)

slots

对象的信号可以关联到map()中,根据自己需求选择合适的重载版本。

 void map(QObject *sender)
 void map()

根据标识获取对象

通过mapping可以根据特定的标识获取原本的对象。

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

给对象设置标识

通过setMapping方法可以给对象设置标识。

 void setMapping(QObject *sender, int id)
 void setMapping(QObject *sender, const QString &text)
 void setMapping(QObject *sender, QObject *object)

删除映射

不需要映射时,通过removeMappings方法传入对应的对象即可删除映射。

 void removeMappings(QObject *sender)

实例

现假设有多个按钮(QPushButton),需要根据不同的按钮点击输出不同的词语,那么我们就可以完美的使用QSignalMapper来处理。

代码

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    signalMapper.setMapping(ui->pushButton, "type1");
    connect(ui->pushButton, &QPushButton::clicked, &signalMapper, QOverload<>::of(&QSignalMapper::map));

    signalMapper.setMapping(ui->pushButton_2, "type2");
    connect(ui->pushButton_2, &QPushButton::clicked, &signalMapper, QOverload<>::of(&QSignalMapper::map));
    signalMapper.setMapping(ui->pushButton_3, "type3");
    connect(ui->pushButton_3, &QPushButton::clicked, &signalMapper, QOverload<>::of(&QSignalMapper::map));
    signalMapper.setMapping(ui->pushButton_4, "type4");
    connect(ui->pushButton_4, &QPushButton::clicked, &signalMapper, QOverload<>::of(&QSignalMapper::map));
    signalMapper.setMapping(ui->pushButton_5, "type5");
    connect(ui->pushButton_5, &QPushButton::clicked, &signalMapper, QOverload<>::of(&QSignalMapper::map));

    connect(&signalMapper, &QSignalMapper::mappedString, this, &MainWindow::ShowName);
}

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

void MainWindow::ShowName(QString str)
{
    // 相同的逻辑抽出来
    qDebug() << "ShowName:";
    if(str == "type1")
    {
        qDebug() << u8"天菜";
    }
    else if(str == "type2")
    {
        qDebug() << u8"傻子";
    }
    else if(str == "type3")
    {
        qDebug() << u8"秀才";
    }
    else if(str == "type4")
    {
        qDebug() << u8"天才";
    }
    else if(str == "type5")
    {
        qDebug() << u8"77";
    }
}

需求升级

现在点击哪个按钮,需要将哪个按钮禁用掉。那么通过QSignalMapeer更加简单。

#include "mainwindow.h"
#include "ui_mainwindow.h"

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

    signalMapper.setMapping(ui->pushButton, ui->pushButton);
    connect(ui->pushButton, &QPushButton::clicked, &signalMapper, QOverload<>::of(&QSignalMapper::map));

    signalMapper.setMapping(ui->pushButton_2, ui->pushButton_2);
    connect(ui->pushButton_2, &QPushButton::clicked, &signalMapper, QOverload<>::of(&QSignalMapper::map));
    signalMapper.setMapping(ui->pushButton_3, ui->pushButton_3);
    connect(ui->pushButton_3, &QPushButton::clicked, &signalMapper, QOverload<>::of(&QSignalMapper::map));
    signalMapper.setMapping(ui->pushButton_4, ui->pushButton_4);
    connect(ui->pushButton_4, &QPushButton::clicked, &signalMapper, QOverload<>::of(&QSignalMapper::map));
    signalMapper.setMapping(ui->pushButton_5, ui->pushButton_5);
    connect(ui->pushButton_5, &QPushButton::clicked, &signalMapper, QOverload<>::of(&QSignalMapper::map));
       
   connect(&signalMapper, &QSignalMapper::mappedObject, this, &MainWindow::ShowObject);
}

void MainWindow::ShowObject(QObject *btn)
{
    ((QPushButton*)(btn))->setEnabled(false);
}

总结

上述的实例场景可能都有点勉强,但是实际工作中,使用的场景很多,例如功能区的按钮,弹窗类的按钮需要根据自身的大小放到对应的位置,正常情况下·,你可能就会写很多个槽进行实现,虽然可能不完全一样,但是逻辑都是相同的,代码看着也冗余。


相关文章

Qt实现在表格中添加气泡显示功能
Qt在QTableWidget、View等表格中添加右击菜单
Qt网络编程之搭建Udp通信【单播、组播、广播】
Qt设置窗口可拖动
Qt通过QProcess启动进程并传递命令行参数
Qt通过Doc模式读取XML并设计一个增删改查方便的操作类

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

QSignalMapper信号映射器的使用 的相关文章

随机推荐

  • React:非受控组件&ref

    非受控组件 在受控组件中 表单数据由react处理 让表单数据由dom处理 就是非受控组件 使用ref从DOM中获取表单数据 点击按钮 Input输入框获得焦点 import React from react class H extends
  • 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接

    启动服务失败 报错信息 com microsoft sqlserver jdbc SQLServerException 驱动程序无法通过使用安全套接字层 SSL 加密与 SQL Server 建立安全连接 错误 sun security v
  • IDEA 代码质量规范插件SonarLint

    IDEA 安装SonarLint插件 1 打开setting 找到Plugins选项 安装SonarLint 插件 如果有就跳过这一步 检索 SonarLint 安装成功后 重新启动IDEA编辑器 2 使用SonarLint 手动检测类文件
  • linux部署web服务器-Nginx

    linux部署web服务器 Nginx 前言 有很多小伙伴想要建立一个自己的web站点 今天就给大家演示一下 准备工作 1 Nginx安装包 2 Linux服务器 3 PCRE安装包 4 手 方式一 手动编译安装 1 安装编译库 yum y
  • jpa利用Specification实现多条件查询排序

    Entity实体类 import java time Instant import javax persistence Column import javax persistence Entity import javax persiste
  • js大纲(流程控制语句对象,函数,数组等)

    一 运算符 1 逻辑运算符 非运算 与运算 像爱情 或运算 像亲情 2 赋值运算符 3 关系运算符 gt gt lt lt 非数值比较时先转换为数字再比较 比较字符串中字符的Unicode编码 4 相等运算符 5 条件运算符也叫三元运算符
  • 操作系统知识点总结(四)进程同步和临界区互斥问题

    一 进程同步的基本概念 临界资源 同步和互斥 在多道程序环境下 进程是并发执行的 不同进程之间存在着不同的相互制约关系 为了协调进程之间的相互制约关系 引入了进程同步的概念 临界资源 虽然多个进程可以共享系统中的各种资源 但其中许多资源一次
  • FPGA学习记录:第28章 VGA显示器驱动设计与验证

    硬件平台 Cyclone IV E EP4CE10F17C8 开发平台 Quartus II 64 Bit Version 13 0 1 Build 232 06 12 2013 SP 1 SJ Full Version 开发板 野火征途p
  • Android——使用ListView显示信息列表

    1 理解ListView的基础使用 1 作用 Android系统中显示列表的控件 2 两种适配器 ArrayAdapter SimpleAdapter 1 数据适配器 作用 把复杂的数据 数组 链表 数据库 集合等 填充在指定视图界面上 是
  • xp系统一直跳出宽带连接服务器,电脑开机后会自动弹出自动宽带连接提示窗口 怎么关闭?...

    自从电脑接宽带后 我们经常会用到宽带连接 甚至为了方便操作 我们直接让电脑开机就自动宽带连接了 而当我们接上路由后 我们会发现电脑再也不用宽带连接了 而这时电脑由于之前被我们设置为开机自动宽带连接 而导致经常会弹出提示窗口 那我们该如何去关
  • Linux--进程间通信、IPC、管道

    目录 1 进程间通信的方法 2 IPC机制 1 有命管道 1 简介 5 管道的特点 6 循环写读 2 无名管道 1 简介 2 代码 4 总体特点 5 管道实现图 1 进程间通信的方法 1 管道 2 信号量 3 共享内存 4 消息队列 5 套
  • java - jdwp远程调试线协议的使用

    前言 线上服务器出现的bug 因为各种复杂环境的原因 经常会很难在本地调试 只能到处打log 然后去服务器查看log日志 以定位问题产生原因 是否一工具能像idea中本地debug一样能直接断点调试呢 介绍 JDWP Java Debug
  • 华为上机考试注意事项及编程技巧(精品)

    这是一篇关于华为招聘软件类职位上机考试的博客 主要介绍一下华为机考的流程 注意事项以及一些机试题中常用的编程技巧 写得有点长 但都是尽心尽力敲的 如果真的要参加华为招聘 或者类似公司的招聘 建议稍微花点时间看完 话不多说 直接进入正题 一
  • 我对维度建模和范式建模的一点理解

    谈维度建模和范式建模之前 先了解下模型设计的三个阶段吧 概念模型 将业务划分成几个主题 逻辑模型 定义各种实体 属性 关系 物理模型 设计数据对象的物理实现 比如表的命名规范 字段的命名规范 字段类型等 一 范式建模 我先来介绍一下范式 范
  • 思维的特点和缺陷

    人类总是喜欢歌颂自己的大脑 比如 思想的威力 逻辑的威力 数学的威力 数学来自于思考 科学的威力 科学来源于思考 还有 意识 这个 人类与动物最大的区别 i blah blah 不过 几乎没有人关心过这种想法究竟来自于人体的哪个器官 心理学
  • 海思3559 安装

    设置地址 开机后任意键 进入 u boot 界面显示 hisilicon 以下内容转自 海思开发记录 一 3559A开发环境搭建 whitefish520的博客 CSDN博客 海思3559a 说明 这次安装的是Ubuntu14 04 64位
  • java8 lambda 获取list对象中重复数据

    工作上的场景 简单记录一下 在这里直接借用业务上的list 不再new 了 List
  • 前台模糊查询中用“\%”替换字符串中的“%”

    最近在做电商项目 前端开发好后就丢给我们 用的时候发现一个缺陷 前台模糊查询的时候 输入一个 或者包含 的词 查询的时候不准确 解决过程中第一个问题 前端用了Js的 decodeURL 转码 将前台输入的 转码了 无法传到后台 参考 htt
  • Java前端知识HTML

    Java前端知识 首先我们用的是HBuilderX软件 当然 前端知识有很多 如果有遗忘或者需要查询的可以去菜鸟驿站查询 比较全 html的文档结构主要是有三部分组成的 1 标记用于html文件的最前面 用来表示html文件的开始 而的标记
  • QSignalMapper信号映射器的使用

    目录 QSignalMapper介绍 Signal 信号 slots 根据标识获取对象 给对象设置标识 删除映射 实例 代码 需求升级 总结 相关文章 QSignalMapper介绍 该类收集一组无参数的信号 并使用与发送信号的对象对应的整