[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; });
作者:师从名剑山
出处:https://www.cnblogs.com/codegb/p/16653436.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!