☰
68.QT-信号槽Lamda表达式新写法
2026/10/9 3:29:15 网站建设 项目流程

什么是Lamda表达式

Lamda表达式是一个函数,其通用写法为: [capture](parameters) mutable ->return-type{statement}

其中:

capture:捕捉列表------可以在表达式中使用代码前后的变量

parameters:给这个lamda表达式传递的参数列表,如果不需要传参的话,parameters可以连同()一起省略。

mutable:mutable修饰符。默认情况下,Lambda函数总是一个const函数,mutable可以取消其常量性。在使用该修饰符时,参数列表不可省略(即使参数为空);

->return-type:返回类型。用追踪返回类型形式声明函数的返回类型。我们可以在不需要返回值的时候也可以连同符号”->”一起省略。此外,在返回类型明确的情况下,也可以省略该部分,让编译器对返回类型进行推导;

{statement}:函数体。内容与普通函数一样,不过除了可以使用参数之外,还可以使用所有捕获的变量。

如下图所示:

[]里面的是代码前后的变量,常用的3个如下所示:

捕获方式含义能否修改外部变量生命周期风险
[&]以引用方式捕获所有自动变量(包括this指针)✅ 能⚠️高(引用悬空,比如捕获临时变量指针,可以改为[ptr])
[=]以值(拷贝)方式捕获所有自动变量(包括this指针的值)❌ 不能直接修改(除非mutable)✅低(独立副本)
[this]仅捕获当前对象的this指针(按值,即指针的拷贝)✅ 能修改对象成员⚠️中(对象被销毁后this悬空)

()里面的是信号函数传来的参数

如果需要设置代码前后变量,则需要这样加引用:

如果需要访问成员函数或者变量,则这样写:

假如信号参数没有名字,比如:

void error(QNetworkReply::NetworkError);

可以这样实现:

connect(reply, static_cast<void (QNetworkReply::*)(QNetworkReply::NetworkError err)>(&QNetworkReply::error), this, [i](QNetworkReply::NetworkError err){ });

其它知识

可以使用std::function,自己实现一个Lamda表达式的回调函数

头文件:

#include <functional> #include <iostream> class LoginWindow : public QWidget { // ... enum LoginResultType{ LoginResult_Wait =0, // 等待 DrawType_UserPwdErrored, // 用户密码错误 DrawType_IpErrored , // IP错误 LoginResult_LoginSucceed // 登录成功 }; using QueryLoginCallback = std::function<LoginResultType(QString user, QString pwd)>; explicit LoginWindow(QWidget *parent, bool *loginIsOk, UserManageInfo *userInfo, const QueryLoginCallback &queryLogin) { // ... 省略 _queryLogin = queryLogin; } // 点击登录按钮 void onLoginButtonClicked() { LoginResultType type = _queryLogin(ui->user->currentText(), ui->pwd->text()); // 调用回调函数 // 处理type } QueryLoginCallback _queryLogin; }

当调用登录界面的时候就这样写:

UserManageInfo userLoginInfo; LoginWindow w(NULL, &loginIsOk, &userLoginInfo, [=](QString user, QString pwd){ qDebug() << "this is from callback f"<<user<< pwd << ip << loginCancel; if(pwd == "123") return LoginWindow::LoginResult_LoginSucceed; // 登录成功 else return LoginWindow::DrawType_UserPwdErrored; // 登录失败 }); w.show(); QApplication::instance()->exec();

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询