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声明的信号和槽的函数, 将其组成一张信号和槽对应的字 ...
随机推荐
- Okhttp常用方法示例
这是我用到的一个util类 public class HttpBaseService { private OkHttpClient client = new OkHttpClient(); priva ...
- JAVA命令行编译及运行
第一部分:单文件 一.背景目标文件HelloWorld.java package ccdate; public class HelloWorld { public static void main(S ...
- C# 查看动态库的方法
使用Vs自带工具:开始菜单-->Microsoft Visual Studio 2010--> Visual Studio Tools-->Visual Studio 命令提示符 输 ...
- Spring事务管理实现方式之编程式事务与声明式事务详解(转)
原文:https://blog.csdn.net/liaohaojian/article/details/70139151 编程式事务 编码方式实现事务管理(代码演示为JDBC事务管理) Spring ...
- iOS学习笔记37-时间和日期计算
一.时间和日期计算 我们在应用开发中,时常须要和时间打交道,比方获取当前时间,获取两个时间点相隔的时间等等,在iOS开发中与时间相关的类有例如以下几个: 1. NSDate:表示一个绝对的时间点 2. ...
- Ubuntu和centos下查看包的安装路径
安装包后,如何查看安装的具体路径? Ubuntu下: dpkg -L <包名> CentOS下: rpm -ql <包名> 助记: l为list的首字母. q为query ...
- 特效effects
Test中使用的特效如下 首先,使用ccg(x,y)建grid,一个Grid 属性就好像一个矩阵,是一个网络的线,组成一系列的方块和矩阵. 一个(16,12)大小的grid将会运行的非常快,但是并不会 ...
- angular学习笔记(九)-css类和样式2
在上一个例子中,元素的类名使用拼接的方法,这样,类名中就不得不带有true或false,并且不易维护,所以,angular使用ng-class属性来控制元素的类名: 我们来看一个小例子,点击error ...
- Win7 CMD大全
Win7 CMD大全 compmgmt.msc---计算机管理 conf—-启动 netmeeting charmap–-启动字符映射表 calc—-启动计算器 chkdsk.exe–-Chkds ...
- NSIS安装程序制作工具判断系统是否安装.NET
前段时间忙了很久的系统总算上线了,由于是WinForm程序不能整个文件夹的发给客户使用.所以必须要打包,记得以前在VS2005中是自带部署功能的.现在换了VS2013那个部署功能完全弄不清方向.最后在 ...