最近无聊写Qt程序玩,发现connect的clicked信号不能传递自定义类型的参数,虽然有其他不传参数的方案可以解决问题,但是绕圈子感觉不爽,于是乎折腾好久才解决问题。

简单来说用到了qt5的新特性和c++11lambda匿名函数

Qt5的connect槽支持普通函数,而不是原来的只支持QObject,只能在slots定义

The new syntax can even connect to functions, not just QObjects:


connect(sender, &Sender::valueChanged, someFunction);

上面的someFunction可以直接用lambda表达式代替,这样就可以通过lambda取上下文变量,变相传递自己想传的类型参数,实例如下:


CustomClass cc; //假设CustomClass是已经定义好了的类
//在需要的地方使用connect连接
connect(sender, &sender::clicked, receiver, [cc]{
             showEditDialog(cc);
         });

以上代码使用值传递方式将CustomClass类型的参数传递给showEditDialog函数,达到目的。
lambda表达式更多的用法:Lambda Expressions in C++

参考资料