QSignalMapper Class
/**************************************************************************************
* QT QSignalMapper
*
* QSignalMapper可以看做是一个信号的转发类。将多个信号作为一个集合,当接受到信号之后,
* 将信号转发出去,并且可以更改发送出去信号参数类型。进行映射之后,接受到信号将会发给
* map()函数,而map()函数又会发送mapped()信号。
* Button是qt中常用到的控件,当使用多个Button时,如果每一个button都对应一个slot函数,
* 就会显得很多余,使用QSignalMapper类就能避免这种情况,提高不少效率。
* 参考:
* http://doc.qt.io/qt-4.8/qsignalmapper.html#setMapping
* http://blog.csdn.net/cuteqt/article/details/4306900
*
* Tony Liu, 2016-5-20, Shenzhen
**************************************************************************************/
. 首先分析参考链接中,QT官网的例子。
class ButtonWidget : public QWidget
{
Q_OBJECT public:
ButtonWidget(QStringList texts, QWidget *parent = ); slots:
void doclicked(const QString &text); private:
QSignalMapper *signalMapper;
}; ButtonWidget::ButtonWidget(QStringList texts, QWidget *parent)
: QWidget(parent)
{
signalMapper = new QSignalMapper(this); QGridLayout *gridLayout = new QGridLayout;
for (int i = ; i < texts.size(); ++i) {
QPushButton *button = new QPushButton(texts[i]); //将信号发送给signalMapper对象的map()函数
connect(button, SIGNAL(clicked()), signalMapper, SLOT(map())); //进行映射,表示当button发送信号给map()函数,map()函数将会发出mapped(texts[i])信号,将texts[i]作为参数
signalMapper->setMapping(button, texts[i]);
gridLayout->addWidget(button, i / , i % );
}
//发出的mapped()函数,由doclicked()函数接收
connect(signalMapper, SIGNAL(mapped(const QString &)),
this, SLOT(doclicked(const QString &))); setLayout(gridLayout);
} .自己实现
class MainWindow : public QMainWindow
{
Q_OBJECT public:
explicit MainWindow(QWidget *parent = );
~MainWindow(); private slots:
void buttonClicked(QWidget *w); private:
Ui::MainWindow *ui; QSignalMapper signalMapper;
}; MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this); signalMapper.setMapping(ui->pushButton_O_1, ui->pushButton_O_1);
signalMapper.setMapping(ui->pushButton_O_2, ui->pushButton_O_2);
signalMapper.setMapping(ui->pushButton_O_3, ui->pushButton_O_3);
signalMapper.setMapping(ui->pushButton_O_4, ui->pushButton_O_4);
signalMapper.setMapping(ui->pushButton_O_5, ui->pushButton_O_5);
signalMapper.setMapping(ui->pushButton_O_6, ui->pushButton_O_6);
signalMapper.setMapping(ui->pushButton_O_7, ui->pushButton_O_7);
signalMapper.setMapping(ui->pushButton_O_8, ui->pushButton_O_8);
signalMapper.setMapping(ui->pushButton_O_9, ui->pushButton_O_9); connect(ui->pushButton_O_1, SIGNAL(clicked()), &signalMapper, SLOT(map()));
connect(ui->pushButton_O_2, SIGNAL(clicked()), &signalMapper, SLOT(map()));
connect(ui->pushButton_O_3, SIGNAL(clicked()), &signalMapper, SLOT(map()));
connect(ui->pushButton_O_4, SIGNAL(clicked()), &signalMapper, SLOT(map()));
connect(ui->pushButton_O_5, SIGNAL(clicked()), &signalMapper, SLOT(map()));
connect(ui->pushButton_O_6, SIGNAL(clicked()), &signalMapper, SLOT(map()));
connect(ui->pushButton_O_7, SIGNAL(clicked()), &signalMapper, SLOT(map()));
connect(ui->pushButton_O_8, SIGNAL(clicked()), &signalMapper, SLOT(map()));
connect(ui->pushButton_O_9, SIGNAL(clicked()), &signalMapper, SLOT(map()));
//发送的参数只能使QString和QWidget,QObject等,而QPushButton继承了QWidget
connect(&signalMapper, SIGNAL(mapped(QWidget *)), this, SLOT(buttonClicked(QWidget *)));
/* 给Button设置一个属性,并给属性添加值,如果一个按键带有多个参数的时候,
* 设置属性是个不错的方法,可以设置多个属性
*/
ui->pushButton_O_1->setProperty("gpio", );
ui->pushButton_O_2->setProperty("gpio", );
ui->pushButton_O_3->setProperty("gpio", );
ui->pushButton_O_4->setProperty("gpio", );
ui->pushButton_O_5->setProperty("gpio", );
ui->pushButton_O_6->setProperty("gpio", );
ui->pushButton_O_7->setProperty("gpio", );
ui->pushButton_O_8->setProperty("gpio", );
ui->pushButton_O_9->setProperty("gpio", ); } MainWindow::~MainWindow()
{
::close(gpio_fd);
delete ui;
} void MainWindow::buttonClicked(QWidget *w)
{
//获取属性,传入的参数使qvariant类型的,需要转化为int类型
int gpioIndex = qvariant_cast<int>(w->property("gpio"));
QString str = QString::number(gpioIndex, );
//由于传入的参数使QWidget,如果要设置按键,需要转为QPushButton,才能操作button
QString ioState = ((QPushButton *)w)->text();
}
QSignalMapper Class的更多相关文章
- QSignalMapper类处理多信号关联同一个槽的方法(2)
例1: QSignMapper *mapper = new QSignMapper(this) QPushButton *btn1 = new QPushButton(this); btn1-> ...
- QSignalMapper类处理多信号关联同一个槽的方法(1)
QSignalMapper这个类并不是个新鲜概念, 早在Qt2里就已经存在, 而且它的功能也是始终如一. 不过由于宣传力度不够(例子里涉及到它的很少)了解这个类人可能还不是很多, 所以特此撰文介绍此类 ...
- QSignalMapper类的使用
Qt中当定义了非常多的button,而他们的信号都同样时(比方都是点击信号),没有必要给他们每一个都设置信号和槽的链接.QSignalMapper给我们攻克了这个难题. 今天完毕这个相似的功能时,不知 ...
- QT 巧用QSignalMapper分类有序地处理大量信号
转自--> http://blog.csdn.net/cuteqt/article/details/4306900 QSignalMapper这个类并不是个新鲜概念, 早在Qt2里就已经存在, ...
- QT之QSignalMapper(可以理解为转发器,多个按钮绑定到一个Edit上,且能分辨。每个单独连接的话,反而麻烦)
QT之QSignalMapper QT之QSignalMapper 简述 效果图 上代码 相关知识点文章 结尾 简述 QSignalMapper我们可以理解为转发器,此话怎讲呢?比如,按钮点击的响应槽 ...
- 【QT开发】信号转发器QSignalMapper的使用
QSignalMapper我们可以将它理解为一个信号翻译器或者说是哥信号转发器.它的主要应用在于可以实现一个函数相应不同按钮的实现功能.比如我们 实现一个计算器的时候,很多不同的按钮都有着差不多的功能 ...
- QSignalMapper is deprecated
今天参考 qt4 的书籍,在 qt5 的平台上面,用了 QSignalMapper,结果收到警告" QSignalMapper is deprecated". 经过一番查找,找到了 ...
- QSignalMapper的使用和使用场景
目录 QSignalMapper的使用和使用场景 常见场景 下面是参考.可看可不看 这篇写的不错,搬运为Markdown了 可以看一下 参考 QSignalMapper的使用和使用场景 QSignal ...
- Qt5中的信号槽
Qt4中的信号槽 Qt4中的信号槽是通过SIGNAL,SLOT两个宏,将参数转换成字符串.Qt编译前,会从源码的头文件中提取由signal和slot声明的信号和槽的函数, 将其组成一张信号和槽对应的字 ...
随机推荐
- WEBSHELL跳板REDUH使用说明
原文链接: http://www.fendou.info/network/webshell-proxy-reduh.html reDuh是可以把内网服务器的端口通过http或https隧道转发到本机, ...
- Dom4j解析和sax解析xml
xml基础知识 1)标签对大小写敏感,2)xml解析方式有两种dom解析和sax解析 3)常用的解析工具有dom的dom4j和sax的sax解析工具 4)文档声明中使用<?xml versio ...
- mac下设置mongodb开机启动方法
Mac OS 的开机启动方式 launchd 是 Mac OS 下用于初始化系统环境的关键进程,它是内核装载成功之后在OS环境下启动的第一个进程.其实它的作用就是我们平时说的守护进程,简单来说,用户守 ...
- spring framework 4 源代码阅读(2)---从ClassPathXmlApplicationContext開始
Application初始化日志 15:23:12.790 [main] DEBUG o.s.core.env.StandardEnvironment - Adding [systemProperti ...
- Spring 一二事(7) - annotation
之前的文章大多都是一带而过,一方面比较简单,一方面不是用的注解形式 在企业开发中,主要还是使用的注解来进行开发的 1 <!-- component:把一个类放入到spring容器中,该类就是一个 ...
- Serviceability
http://hg.openjdk.java.net/jdk7u/jdk7u2/hotspot/file/6259c6d3bbb7/agent/doc/clhsdb.html http://blog. ...
- 服务器搭建2 VSFTP搭建FTP服务器
FTP服务器是平时应用最为广泛的服务之一.VSFTP是Very Secure FTP的缩写,意指非常安全的FTP服务.VSFTP功能强大,通过结合本地系统的用户认证模块及其多功能的配置项目,可以快速有 ...
- centos 7 中的 systemd
systemd的服务管理程序 systemctl是最主要的工具.它融合 service 和chkconfig的功能于一体.你可以使用它永久性或只在当前会话中启用/禁用服务. 下面命令用于列出正在运行的 ...
- 中文转Punycode
package cn.cnnic.ops.udf; public class GetPunycodeFromChinese { static int TMIN = 1; static int TMAX ...
- 实战入侵(突破FCK+安全狗上传)
PS:有点尴尬,二次上传突破FCK,免杀马儿过狗. 刚开始和超霸一起弄,TMDGB.弄到四点多,早上尼玛七点多的又去考试,虽然考试还是睡着了,但是TMDGB感觉日子好充实啊! FCK上传地址如下所示: ...