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就派上用场啦!

相关知识点文章

QT之内存泄漏管理

结尾

http://blog.csdn.net/ly305750665/article/details/53790209

时间: 2024-08-09 23:13:41

QT之QSignalMapper(可以理解为转发器,多个按钮绑定到一个Edit上,且能分辨。每个单独连接的话,反而麻烦)的相关文章

Qt源码分析之信号和槽机制(QMetaObject是一个内部struct)

Qt的信号和槽机制是Qt的一大特点,实际上这是和MFC中的消息映射机制相似的东西,要完成的事情也差不多,就是发送一个消息然后让其它窗口响应,当然,这里的消息是广义的说法,简单点说就是如何在一个类的一个函数中触发另一个类的另一个函数调用,而且还要把相关的参数传递过去.好像这和回调函数也有点关系,但是消息机制可比回调函数有用多了,也复杂多了 MFC中的消息机制没有采用C++中的虚函数机制,原因是消息太多,虚函数开销太大.在Qt中也没有采用C++中的虚函数机制,原因与此相同.其实这里还有更深层次上的原

JDK动态代理深入理解分析并手写简易JDK动态代理(上)

原文引用https://www.dazhuanlan.com/2019/08/26/5d6300df6f20f/ 博客真的是好几个月没更了,2019新年第一篇,继续深入动态代理,前两篇简单分析了动态代理的实现原理之后,这次继续深入了解具体的实现方式,并手写一套简易的动态代理已加强理解: 本博客关于Java动态代理相关内容直达链接: JDK动态代理浅析 Cglib动态代理浅析 JDK动态代理深入理解分析并手写简易JDK动态代理(上) JDK动态代理深入理解分析并手写简易JDK动态代理(下) 博客真

Qt:走马灯代码理解

走马灯是编程学习中常用到的示例代码.在这里把从中学到的知识进行一个汇总.如有不对之处,请各位指正. 一:思路 走马灯首先要考虑是在特定时间点将显示内容向一个方向移动,当显示最后有空位时,循环填写显示内容. 要有一个定时器:处理定时器的事件:显示的文本内容:当显示内容在控件中移动时,需要重绘控件. 当控件隐藏后,停止走马灯. 处理控件隐藏事件. 当控件显示时,开始走马灯. 处理控件显示事件. 二:头文件 #ifndef MAINWIDGET_H#define MAINWIDGET_H #inclu

Qt之Q_PROPERTY宏理解

在初学Qt的过程中,时不时地要通过F2快捷键来查看QT类的定义,发现类定义中有许多Q_PROPERTY的东西,比如最常用的QWidget的类定义: Qt中的Q_PROPERTY宏在Qt中是很常用的,那么它有什么作用呢? Qt提供了一个绝妙的属性系统,Q_PROPERTY()是一个宏,用来在一个类中声明一个属性property,由于该宏是qt特有的,需要用moc进行编译,故必须继承于QObject类. Q_PROPERTY(type name READ getFunction [WRITE set

Qt中setGeometry的理解

如果在控件中加上了layout布局,就会发现发现没有办法使用setGeometry函数了,这是因为布局已经被layout管理,没你啥事了. 但是父控件被layout管理,父控件的子控件却没有啊 ,所以在创建子控件的时候,需要指定子控件的父控件是谁.这样子控件就可以使用 setGeometry函数,可以自由的调整位置,但是只能在父控件的范围内调整位置,同时必须注意setGeometry之后一定要调用show函数, 否则可能看不到控件存在.

深入理解 hash 函数、HashMap、LinkedHashMap、TreeMap 【上】

前言 Map 是非常常用的一种数据接口.在 Java 中,提供了成熟的 Map 实现. 图 1 最主要的实现类有 Hashtable.HashMap.LinkedHashMap和 TreeMap.在 HashTable 的子类中,还有 Properties的实现.Properties 是专门读取配置文件的类,我们会在稍后介绍.这里首先值得关注的是 HashMap 和 HashTable 两套不同的实现,两者都实现了 Map 接口.从表面上看,并没有多大差别,但是在内部实现上却有些微小的细节. 首

深入理解闭包系列第四篇——常见的一个循环和闭包的错误详解

前面的话 关于常见的一个循环和闭包的错误,很多资料对此都有文字解释,但还是难以理解.本文将以执行环境图示的方式来对此进行更直观的解释,以及对此类需求进行推衍,得到更合适的解决办法 犯错 function foo(){ var arr = []; for(var i = 0; i < 2; i++){ arr[i] = function(){ return i; } } return arr; } var bar = foo(); console.log(bar[0]());//2 以上代码的运行

深入理解计算机系统(2.2)---布尔代数以及C语言上的位运算

本文转载地址:http://www.cnblogs.com/zuoxiaolong/p/computer6.html 布尔代数上的位运算 布尔代数是一个数学知识体系,它在0和1的二进制值上演化而来的. 我们不需要去彻底的了解这个知识体系,但是里面定义了几种二进制的运算,却是我们在平时的编程过程当中也会遇到的.这四种运算分别是或.与.非和异或.下图展示了在布尔代数的知识体系中,对这四种运算的定义. 从左至右依次是非.与.或以及异或.这个图阐述的是针对一位二进制的运算结果,我们可以将其扩大到N位二进

理解 BigPipe 大的页面分割成一个一个管道

比如首页非常多内容, 如果后台全部一次性返回, 需要较长的时间, 这时候就可以把页面分割了 java可以使用多线程, 把页面的内容分割成几分 php可以利用 扩展中的curl 模块,可以在该模块中curl_multi_fetch() 函数进行批处理请求 前端通过js 把返回的一块一块的 内容通过 对应的id  组装到  对应的页面模块上 也许你会想到 ajax, 但是ajax有以下缺点 1. 必须多一次xmlHttp 请求,  这个请求可能还发生在页面渲染之后,  这段时间浪费了 2. 多一次a