Qt之QSignalMapper类的使用解决大批量操作问题

       最近在用QT在做一个系统管理平台。因为要涉及点击事件,笔者在管理界面上采用了大批量的按钮控件,为什么要用大量的按钮,这个是客户提出的需求所致,但是从技术层面考虑,总是感觉怪怪的。接下来只能从技术的层面一个一个攻破,对于Qt的应用开发,笔者也是一边学一边用,也是艰难前行。小青蛙在慢慢爬出井底。在使用大量按钮控件的同时,就遇到一个严重的问题,大量按钮事件,所对应的槽函数也是大量的。每一个按钮写一个槽函数这种傻大粗的操作是绝对不可取的。当时就在考虑,Qt有没有大批量操作按钮的情况,在网上搜索一番也是有各种各样的方式,大量都是曲线救国的方式,采用重写函数封装完成操作,也是蛮厉害的,但是笔者想有没有一种比较直观而简洁的方式来实现,最终找到了这个类,不得不说QSignalMapper类的使用是批量操作最好用的方法。真的是解决一个大难题。看来QT还是比较贴心的。

       SignalMapper类主要作用是将大量信号进行编号,然后将每一个带编号的信号转发到相应的槽函数中,实现对控件的批量操作。官方的解释是可以把SignalMapper这个类看成是信号的翻译和转发器, 它可以把一个无参数的信号翻译成带int参数、QString参数、QObject*参数或者QWidget*参数的信号, 并将之转发。接下来笔者将关键代码来解析一下该类的使用。

 connect(oneline->pushbuttonNum[pageindex][y][x], SIGNAL(clicked()), signalmapper, 
 SLOT(map()));//原始信号传递给signalmapper
 signalmapper->setMapping(oneline->pushbuttonNum[pageindex][y][x],20*y+x);                      
//20个信号源通过INT进行编号
 connect(signalmapper, SIGNAL(mapped(int)), this, SLOT(doClicked(int)));                        
//将转发的带标号的信号连接到最终的槽函数

        在上例中,连接函数把本来不带参数的信号连接到signalmapper的map槽函数, 这样signalmappe类将和按钮信号牢牢的绑定在一起,能在第一时间接收到原始信号。

        第二个函数中第一个参数是参数对象,将每个对应的按钮对象,按照第二个参数类型进行编号,笔者这里是按照int整数编号,也可以是string等其他方式,看实际需要。

        调用setMapper方法目的是告诉signalmapper如何去处理原始信号。把原始信号转化为一个带int参数的信号,最后把接收转化的带参数信号, 转化为信号与槽函数连接, 在槽函数doClicked(int)中获得需要的数据。根据传递过来的int编号确定是对应的按钮操作。

    

猜你喜欢

转载自blog.csdn.net/enjoybocai/article/details/107574222