QSignalMapper信号映射器的使用

简介: QSignalMapper信号映射器的使用

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);
}


总结

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

目录
相关文章
|
网络性能优化
【AXI】解读AXI协议的额外信号(QOS信号,REGION信号,与USER信号)
【AXI】解读AXI协议的额外信号(QOS信号,REGION信号,与USER信号)
【AXI】解读AXI协议的额外信号(QOS信号,REGION信号,与USER信号)
ZYNQ-AXI总线的信号接口要求以及时序关系
ZYNQ-AXI总线的信号接口要求以及时序关系
305 0
ZYNQ-AXI总线的信号接口要求以及时序关系
|
18天前
|
NoSQL Linux 程序员
【linux进程信号(一)】信号的概念以及产生信号的方式
【linux进程信号(一)】信号的概念以及产生信号的方式
|
2月前
|
安全
SCXI-1193 控制器 多路复用器开关模块 NI 仪器仪表 SCXI-1001
`SCXI-1193`是款500 MHz的四路8x1多路复用器,支持多种配置。关键特性包括:射频功率处理(10瓦至500 MHz),初始DC路径电阻低,寿命终时约为1.0ω。最大RF功耗限制为7 W,扫描速率为100通道/秒。继电器寿命达5000万次机械循环和30万次电气循环。物理特性包括机电继电器,36个MCX连接器和2个SMB触发器插孔。尺寸为3.0 × 17.3 × 19.8厘米,工作温度范围从0°C到50°C。产品遵循EN 61010-1等安全标准和EN 61326-1的EMC规定。
|
7月前
|
传感器 存储 内存技术
电容的作用及其应用
一、什么是电容 电容是指电路中的一种元件,用于储存电荷。它是由两个导体板之间隔开的绝缘介质(通常是空气或电介质)组成的。当电容器接通电源时,正负电荷会在导体板上积累,形成电场。电容的单位是法拉(F),1法拉等于1库仑/伏特。电容的大小取决于导体板的面积、导体板之间的距离以及介质的介电常数。较大的电容可以储存更多的电荷。电容器在电子电路中广泛应用,例如用于滤波、耦合、存储和调节电压等方面。 二、电容的作用 电容在电子电路中有多种作用: 1. 储存电荷:电容器可以储存电荷,当电容器充电时,正电荷会聚集在一侧的导体板上,负电荷则聚集在另一侧的导体板上。当电容器放电时,储存的电荷会释放出来。 2. 滤
48 0
|
3月前
|
容器
一款高输出电流 PWM 转换器
一、产品描述 TPS543x 是一款高输出电流 PWM 转换器,集成了低电阻、高侧 N 沟道 MOSFET。具有所列的特性的基板上还包括高性能电压误差放大器(可在瞬态条件下提供高稳压精度)、欠压锁定电路(用于防止在输入电压达到 5.5V 前启动)、内部设置的慢启动电路(用于限制浪涌电流)以及电压前馈电路(用于改进瞬态响应)。通过使用 ENA 引脚,关断电源电流通常可减少到 15µA。其他特性包括高电平有效使能端、过流限制、过压保护和热关断。为降低设计复杂性并减少外部元件数量,对 TPS543x 反馈环路进行内部补偿。TPS5431 可采用高达 23V 的电源轨运行。TPS5430 可调节多种
24 1
|
10月前
为不同的调制方案设计一个单载波系统(映射器-信道-去映射器)(Matlab代码实现)
为不同的调制方案设计一个单载波系统(映射器-信道-去映射器)(Matlab代码实现)
|
7月前
|
传感器
电阻的作用及其应用
一、什么是电阻 电阻是指电流在电路中流动时遇到的阻碍。它是电路中的一种基本元件,用来限制电流的流动。电阻的单位是欧姆(Ω),表示电阻对电流流动的阻碍程度。电阻的大小取决于电阻器的材料、长度、横截面积等因素。当电流通过电阻时,会产生电阻热,将电能转化为热能。电阻常用于调节电路中的电流和电压,以及控制电路的工作状态。 二、电阻的作用 电阻在电路中起到以下几个作用: 1. 限制电流:电阻可以限制电流的流动。根据欧姆定律,电流(I)等于电压(V)除以电阻(R),因此增加电阻会减小电流。这使得电阻可以用来控制电路中的电流大小。 2. 控制电压:电阻可以分压电路中的电压。根据电压分压定律,当电阻串联在电路
93 0
|
7月前
|
传感器
三极管的作用及其应用
一、什么是三极管 三极管(transistor)是一种电子元件,用于放大电信号、开关电路和稳压电路等应用中。它由三个不同掺杂的半导体材料层叠在一起构成,通常为两个PN结和一个夹在中间的P或N型区域。 三极管的三个电极分别为基极(base)、发射极(emitter)和集电极(collector)。其中基极用于控制电流流动,发射极用于输入电流,集电极用于输出电流。通过控制基极电流的大小,可以控制集电极电流的放大倍数。 三极管有两种基本类型:NPN型和PNP型。NPN型三极管中,基极为P型,发射极为N型,集电极为P型;PNP型三极管中,基极为N型,发射极为P型,集电极为N型。 三极管的工作原理是基于
318 1
|
10月前
|
Linux 索引
中断控制器(GIC)(上)
中断控制器(GIC)
297 0