使用Qt的过程中会遇到多个按钮,点击信号相同,处理的槽函数结构也大体一致只有部分区别,这样就没有必要每个都设置单独的信号和槽链接,这样会导致工程中出现大量的冗余代码。另外也有非常简单的粗暴的办法就是使用QObject的sender方法来查找信号的发送者,但是这样也不符合Qt采用的信号槽的思想体系,所以还是按官方的推荐解决思路采用QSignalMapper解决问题。

使用QSignalMapper

假设我们有一个DisplayTrangles(int type)的槽函数,注释掉原有的connect方法,新建一个QSignalMapper对象:

1
QSignalMapper *mapper = new QSignalMapper(this);

第二步建立一个无参数的链接:

1
connect(ui.actionMeshsurface, SIGNAL(triggered()), mapper, SLOT(map()));

第三步对mapper进行转换:

1
mapper->setMapping(ui.actionMeshsurface, 1); // 第一个参数是控件,第二个是转换的参数

第四步把信号转发到最终处理函数DisplayTrangles(int type)中:

1
connect(mapper, SIGNAL(mapped(int)), this, SLOT(DisplayTriangles(int)));

这样操作完毕后,我们就可以在槽函数内接收type的值来分别进行操作

1
2
3
4
5
6
7
8
9
//设置网格模型显示模式
...
switch (type) {
case 1: viewer_2->setRepresentationToSurfaceForAllActors();break; //网格模型以面片形式显示
case 2: viewer_2->setRepresentationToPointsForAllActors();break; //网格模型以点形式显示,一般不会用到
case 3: viewer_2->setRepresentationToWireframeForAllActors();break; //网格模型以线框图模式显示
default:break;
}
...