QT之QSignalMapper(可以理解为转发器,多个按钮绑定到一个Edit上,且能分辨。每个单独连接的话,反而麻烦)
QT之QSignalMapper
简述
QSignalMapper我们可以理解为转发器,此话怎讲呢?比如,按钮点击的响应槽,绑定到QSignalMapper上,QSignalMapper收到按钮的点击后,又通知到另外的控件上做处理。有的朋友会问了,为什么要这么麻烦,需要转一手,不能去掉中间的QSignalMapper,而直接调用吗。答案当然是可以的,为什么需要QSignalMapper这个转发器呢,我们先来看下效果,然后再看看代码,相信大家会喜欢上QSignalMapper这个转发器的。
效果图
上代码
void QSignalMapper_Demo::initControl()
{
QVBoxLayout *pLayout = new QVBoxLayout(this);
QString str = "Button1 Button2 Button3 Button4 Button5";
QStringList strList = str.split(" ");
QSignalMapper *pMapper = new QSignalMapper(this);
int nRowCnt = 0;
foreach(QString itor, strList)
{
QPushButton *pBtn = new QPushButton(this);
pBtn->setFixedHeight(CON_HEGIHT);
pBtn->setText(itor);
connect(pBtn, SIGNAL(clicked()), pMapper, SLOT(map()));
pMapper->setMapping(pBtn, pBtn->text());
pLayout->addWidget(pBtn, nRowCnt++, 0);
}
QLineEdit *pEdit = new QLineEdit(this);
pEdit->setFixedHeight(CON_HEGIHT);
connect(pMapper, SIGNAL(mapped(QString)), pEdit, SLOT(setText(QString)));
pLayout->addWidget(pEdit, nRowCnt, 0);
pLayout->addStretch();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
眼光利索的朋友看到了我代码中,代码不规范,说你代码怎么就new,怎么没deltete,你这样不会内存泄漏吗,这里告诉大家是不会的哦,相关知识可以看我之前写的QT之内存泄漏管理。
回到本节,看完QSignalMapper的用法,我们回过头再看看,不用QSignalMapper,又该如何实现上面的效果呢,编辑框中我们可以看到,是哪个按钮被按下了。
//去掉QSignalMapper
void QSignalMapper_Demo::initControl()
{
QVBoxLayout *pLayout = new QVBoxLayout(this);
QString str = "Button1 Button2 Button3 Button4 Button5";
QStringList strList = str.split(" ");
int nRowCnt = 0;
foreach(QString itor, strList)
{
QPushButton *pBtn = new QPushButton(this);
pBtn->setFixedHeight(CON_HEGIHT);
pBtn->setText(itor);
//这里,响应的是同一个槽,按钮被点击后,我们却不能知道是哪个按钮被按下。
connect(pBtn, SIGNAL(clicked()), this, SLOT(onclicked()()));
//有的朋友说,可以每个按钮绑定不同的槽做区分呀,这样做可以是可以,但是你觉得使用QSignalMapper是不是要更简洁些呢?
pLayout->addWidget(pBtn, nRowCnt++, 0);
}
QLineEdit *pEdit = new QLineEdit(this);
pEdit->setFixedHeight(CON_HEGIHT);
pLayout->addWidget(pEdit, nRowCnt, 0);
pLayout->addStretch();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
看完代码,相信大家都知道了QSignalMapper的美!有的朋友又问了,我什么时候该用QSignalMapper呢?通过上面的例子很简单呀,我们需要处理同一个事情时,而简化多个不同的槽却做着相同的事,我们的QSignalMapper就派上用场啦!
相关知识点文章
结尾
http://blog.csdn.net/ly305750665/article/details/53790209
QT之QSignalMapper(可以理解为转发器,多个按钮绑定到一个Edit上,且能分辨。每个单独连接的话,反而麻烦)的更多相关文章
- QT学习记录之理解信号槽机制
作者:朱金灿 来源:http://blog.csdn.net/clever101 QT的事件机制采用的信号槽机制.所谓信号槽机制,简而言之就是将信号和信号处理函数绑定在一起,比如一个按钮被单击是一个信 ...
- JDK动态代理深入理解分析并手写简易JDK动态代理(上)
原文同步发表至个人博客[夜月归途] 原文链接:http://www.guitu18.com/se/java/2019-01-03/27.html 作者:夜月归途 出处:http://www.guitu ...
- Qt源码分析之信号和槽机制(QMetaObject是一个内部struct)
Qt的信号和槽机制是Qt的一大特点,实际上这是和MFC中的消息映射机制相似的东西,要完成的事情也差不多,就是发送一个消息然后让其它窗口响应,当然,这里的消息是广义的说法,简单点说就是如何在一个类的一个 ...
- Qt之Q_PROPERTY宏理解
在初学Qt的过程中,时不时地要通过F2快捷键来查看QT类的定义,发现类定义中有许多Q_PROPERTY的东西,比如最常用的QWidget的类定义: Qt中的Q_PROPERTY宏在Qt中是很常用的,那 ...
- Qt信号槽机制理解
1. 信号和槽概述 > 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式(发布-订阅模式).当某个`事件`发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(s ...
- QT之Qt之Q_PROPERTY宏理解
在初学Qt的过程中,时不时地要通过F2快捷键来查看QT类的定义,发现类定义中有许多Q_PROPERTY的东西,比如最常用的QWidget的类定义: Qt中的Q_PROPERTY宏在Qt中是很常用的,那 ...
- Qt坐标转换系统的理解
转 https://blog.csdn.net/hgcprg/article/details/53537106 今天又看了一篇对Qt坐标转换系统以及QTransform的博客,作者讲的非常透彻,链接如 ...
- 对Delphi控件作用的新理解(控件本身的源代码就是一个很强的工业级源码)
最近几天,对Delphi控件的含义有了一个新的理解.其实它不仅仅是给程序员提供功能的一个表层调用,控件本身的源代码就是一个很强的工业级源码.而且它的Main例子,往往就已经是半成品.而别的语言里没有那 ...
- 在linux,arm上的屏幕搜索wifi并连接(qt,多选择,wifi按信号排列)转
先上代码!! #include "widget.h"#include "ui_widget.h"#include <QVBoxLayout>#inc ...
随机推荐
- js面向对象的选项卡
前言: 选项卡在项目中经常用到,也经常写,今天在github突然看到一个面向对象的写法,值得收藏和学习. 本文内容摘自github上的 helloforrestworld/javascriptLab ...
- ios 不支持屏幕旋转
- (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; }
- CSS垂直居中的实现
这个问题可以说是老生常谈了,面试时经常问道,一直没整理过,这次做个系统梳理 1.利用display:table实现 从caniuse.com上查到,display:table可以兼容到IE8,以目前环 ...
- 25、驱动调试之打印到proc虚拟文件
1.dmesg指令是通过读/proc/kmsg来获取打印信息,也可以通过cat /proc/kmsg打印: 说明:kmsg是环形缓存区,只能读一次 2.内核中fs/proc目录下有相关文件,比如pro ...
- SetForegroundWindow的正确用法
在SetForegroundWindow之前比较早的时候(比如main函数里)调用一下以下代码: DWORD dwTimeout = -1; SystemParametersInfo(SPI_GETF ...
- js如何生成[n,m]的随机数
js如何生成[n,m]的随机数 一.总结 一句话总结:生成随机数就是用的Math的random方法. 1.Math.random()得到的数据的左右开闭情况是怎样的? 左闭又开 所以Math.floo ...
- ios开发之图层与核心动画一:图层CALayer的认识
#import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutl ...
- Mac下Android studio 之NDK配置教程(一)
Mac下Android studio 之NDK配置教程(一) 1.概述 近期项目全线转移到Mac下使用使用Android studio开发. 遇到关键代码封装到 ***native***层,此时在wi ...
- 【u110】灾后重建
Time Limit: 1 second Memory Limit: 128 MB [问题描述] B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前, ...
- [RxJS] Add debug method to Observable in TypeScript
Observable.prototype.debug = function(message: any) { return this.do( (next) => { if(!environment ...