[Qt基础-07 QSignalMapper]
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;
});
}
主要的函数
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);
作用是设置对象和转发参数的映射关系,也就是设置对象的信号转发之后,重新发射的信号所带的参数。
removeMappings(删除指定对象的映射关系)
该函数的原型为:
void removeMappings(QObject* sender);
作用是移除指定对象信号的映射关系。
mapping(获取对象和转发参数的映射关系)
函数原型为:
QObject * mapping(int id) const
QObject * mapping(const QString &id) const
QObject * mapping(QWidget *widget) const
QObject * mapping(QObject *object) const
该函数的作用是,根据转发的参数,来获取对应的对象。
信号和槽
槽函数
map
函数原型为:
void map(QObject *sender)
void map()
带参数的这个map函数,是会发射sender这个对象所映射的信号。而不带参数的这个map函数会根据槽函数所连接的信号,来发射对应的带参数的信号。
信号
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]的更多相关文章
- 基于C/S架构的3D对战网络游戏C++框架_04客户端详细设计与OpenGL、Qt基础
本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...
- javaSE基础07
javaSE基础07 一.static静态修饰符 用了static修饰的变量就会变成共享的属性,只会初始化一次,在内存中只存在一个,并且每个对象都可以访问,存放在方法区(数据共享区) 1.1 stat ...
- javascript基础07
javascript基础07 1.节点 元素.childNodes : 属性 只读 属性 子节点列表集合 元素.childNodes 只包含子节点,不包含孙节点 DOM节点的类型有很多种,w3c标准有 ...
- Qt基础——让使用Designer创建的UI也能自动适应窗口大小
原文请看:http://www.cnblogs.com/linmeng/archive/2012/07/05/2559259.html 我们知道,通过Qt的各种Layout可以实现控件的自动布局. 但 ...
- QT 巧用QSignalMapper分类有序地处理大量信号
转自--> http://blog.csdn.net/cuteqt/article/details/4306900 QSignalMapper这个类并不是个新鲜概念, 早在Qt2里就已经存在, ...
- C++ Qt基础知识
时间如流水,只能流去不流回. 学历代表你的过去,能力代表你的现在,学习能力代表你的将来. 学无止境,精益求精. 记录C++ Qt的基础知识学习记录 <C++ Qt设计模式(第二版)>
- qt基础知识之类库概述
qt是用标准c++编写的跨平台开发类库,它对标准c++进行拓展,引入元对象系统.信号&槽.属性等特征 全局定义 容器类及对应迭代器 qt的模块化体系,分为 基本模块和拓展模块,一个模块通常就是 ...
- C/C++ Qt 基础通用组件应用
QT 是一个跨平台C++图形界面开发库,利用QT可以快速开发跨平台窗体应用程序,在QT中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率. 目前,QT开发中常用的基础 ...
- [Qt基础内容-08] Qt中MVC的M(Model)
Qt中MVC的M(Model)简单介绍 Qt有自己的MVC框架,分别是model(模型).view(视图).delegate(委托),这篇文章,简单的介绍以下Qt中有关model(模型)的类以及一些基 ...
- Qt基础之开发环境部署
将 Qt 5.6 集成至 VS2015 摘要: 由于VS2015不再支持addin,所以要用其他手段. 这里给出64位系统下的安装步骤,32位类似. 一.安装VS2015 过程略.值得注意的是要选择需 ...
随机推荐
- shell脚本,主要是对输入参数检验
usage(){ echo "\nUSAGE:\n" echo "PmActivityReport.sh\t-type\t<latency|activity&g ...
- Qt音视频开发49-通用截图截屏
一.前言 采用了回调方式的视频通道,截图只需要对解析好的QImage对象直接保存即可,而对于句柄的形式,需要调用不同的处理策略,比如vlc需要用它自己提供的api接口函数libvlc_video_ta ...
- C Primer Plus 第6版 第三章 编程练习参考答案
编译环境VS Code+WSL GCC 源码在文末下载 /*第1题*************************/ #include<stdio.h> int main() { int ...
- java学习第一章
java 语法第一章 helloworld 编写 class helloworld public static void main(String[] args){ System.out.printli ...
- DICOM-SCP,可以直接使用的SCP(.net framework 4.5)控制台接收端
此程序引用的是Dicom.Core 4.0.8.0,也是最后一版支持部署在.net framework 4.5 或以下环境的.如需要部署在.net4.6.1以上的需要查看另一个文档. 1 using ...
- Kotlin:【异常处理】自定义异常、先决条件函数
- 四.1 Redis 五大数据类型/结构的详细说明/详细使用(List 列表数据类型详解和使用)
四.1 Redis 五大数据类型/结构的详细说明/详细使用(List 列表数据类型详解和使用) @ 目录 四.1 Redis 五大数据类型/结构的详细说明/详细使用(List 列表数据类型详解和使用) ...
- 载誉而归!天翼云荣获第23届中国IT用户满意度大会多项殊荣
10月25日,2024第23届中国IT用户满意度大会暨首届工业产品满意度交流会在北京举行.现场揭晓"2024中国IT用户满意度征集结果",天翼云凭借领先的产品技术.完善的客户服务以 ...
- 已有天翼云Ubuntu云主机,搭建幻兽帕鲁服务器
本文为您介绍使用您已有的天翼云Ubuntu云主机搭建幻兽帕鲁服务器的操作. 操作前提 如果您尚未购买天翼云云主机,推荐您使用更简单快捷的一键部署方案,具体请参考:镜像一键部署Palworld幻兽帕鲁服 ...
- 恭喜我同事的论文被IEEE HPCC收录!
近日,由天翼云科技有限公司云网产品事业部天玑实验室撰写的<关于公有云区分负载QoS感知的内存资源动态超分管理优化>(Thoth:Provisioning Overcommitted Mem ...