当前位置: 首页 > news >正文

Qt信号与槽如何给槽函数传参

省流:Lambda表达式

    connect(按钮,&QPushButton::clicked,接收器的地址,[=](){接收器的地址->函数(参数);});//例子connect(B_life,&QPushButton::clicked,player_info_,[=](){player_info_->life_change(1);});

正文:

本人作为初学Qt的小白,想要做个简单的小游戏,游戏中要设置两个按钮,一个是“疗伤”:生命值+1;一个是“攻击”:生命值-1;
于是我先声明了一个“玩家信息”类,定义了一个“生命值改变”的函数:

#include <QObject>
class Player_Info:public QObject{Q_OBJECT
public:Player_Info(QObject* parent,int* life);int* life;		//设置初始生命值void life_change(int a);		//“生命值改变”的函数
};

void life_change(int a);的具体实现如下:若传入a=1,则生命值+1,若传入a=-1,则生命值-1

void Player_Info::life_change(int a){*life+=a;		//若传入a=1,则生命值+1,若传入a=-1,则生命值-1
}

然后天真的小白用信号与槽写下了这行代码

Player_Model::Player_Model(QWidget* parent){
B_life=new QPushButton("疗伤",this);	//创建一个"疗伤"的按钮
connect(B_life,&QPushButton::clicked,player_info_,player_info_->life_change(1));	//错误写法
}

我的想法是,点击按钮后,触发life_change()函数,并给它传入参数1,使生命值+1。问题就出在传入参数。
connect()的参数只能是地址,也就是这样:
connect(触发器的地址,信号函数的地址,接收器的地址,槽函数的地址)
也就是说你只能往槽函数的位置放一个函数地址,程序也只能识别到地址,识别不到参数,那么参数放哪呢?不好意思放不了。
也就是说我的life_change(1)根本没法直接实现,唯一的办法就是再定义一个函数

void Player_Info::life_increate(){ life_change(1); }

然后把这个函数的地址放在connect()槽函数的位置
然而这样极其的麻烦,如果我要让生命值+1,生命值+2,生命值+3,每实现一个功能我就要多写一个函数。
如何解决呢?有一个快捷新建函数的办法:Lambda函数表达式
于是有了下面的写法:

    connect(B_life,&QPushButton::clicked,player_info_,[=](){player_info_->life_change(1);});

虽然说还是创建了一个新函数,但是工作量明显少了很多,半完美解决!


但注意,这个方法有个巨坑,或者说是Lambda表达式的坑

就是不要在Lambda表达式里修改临时变量
比如这样写:

Player_Model::Player_Model(QWidget* parent){
B_life=new QPushButton("疗伤",this);	//创建一个"疗伤"的按钮
int life=3;
connect(B_life,&QPushButton::clicked,player_info_,[=](){life+=1;});
}

因为当这段代码执行完后,B_life按钮与[=](){life+=1;}函数的连接会被创建,但life作为一个局部变量会被销毁,此时如果你点击按钮,就会报错。

http://www.jsqmd.com/news/178337/

相关文章:

  • RAG从入门到精通(十五)——高级RAG范式 - 指南
  • 技术分享】基于Simulink的三相四桥臂逆变器仿真模型:电压电流双闭环dq0轴控制实现带不平...
  • 基于模板匹配的Matlab车牌识别系统
  • 四轮独立驱动横摆角速度控制:LQR算法的魅力之旅
  • 【毕业设计】基于ManTra-Net的图像篡改检测方法研究与应用实现
  • 语言模型推理能力的跨领域泛化性评估研究
  • MATLAB 下基于多尺度总变分方法的高光谱图像分类探索
  • VScode扩展报错CMake was unable to find a build program corresponding to “MinGW Makefiles“解决办法
  • django基于Hadoop的热点新闻推荐分析系统的设计与实现_76te2-爬虫可视化
  • 基于SOGI - PLL的永磁同步电机无感FOC探索
  • 麻雀算法及其改进在机械臂轨迹规划中的应用探索
  • django基于hadoop的零食大礼包商城销售大数据分析及可视化系统 echart_86990-爬虫可视化
  • 23 电平 MMC 逆变器并网仿真(PI 控制)那些事儿
  • 12-电-热综合能源系统耦合优化调度-100% 摘要:代码做了一个IEEE39节点和6节点热网...
  • django基于Python的电商用户的数据行为分析与可视化 爬虫
  • Ubuntu数字键盘失灵问题解决
  • 光伏MPPT仿真:直接电压法(恒定电压法)与PID控制的奇妙结合
  • django基于DJANGO的智慧社区停车场车位可视化平台的设计与实现_8nyri-爬虫可视化
  • 探索区域综合能源系统(RIES)优化:从模型到Matlab实现
  • AHK调试报错: An internal error has occurred in the debugger engine解决方法
  • 【毕业设计】基于机器学习的蘑菇毒性预测分析及应用实现
  • 【数字信号去噪】基于matlab鳄鱼伏击算法优化变分模态分解CAOA-VMD数字信号去噪(优化K值 alpha值 综合指标 适应度函数包络熵)【含Matlab源码 14792期】
  • 深度学习毕设项目推荐-基于随机森林的贷款可能性预测系统实现
  • FDTD案例:探索二维光子晶体结构中的完整拓扑状态集激射
  • 【数字信号去噪】基于matlab改进的蜣螂算法优化变分模态分解IDBO-VMD数字信号去噪(优化K值 alpha值 综合指标 适应度函数包络熵)【含Matlab源码 14808期】
  • TypeScript开发基础(14)——面向对象之接口
  • 欧姆龙NJ控制程序:功能宝藏与编程思路的跨平台应用
  • 清理系统Python环境中误操作安装的pip包(有风险)
  • Python 自动驾驶图像识别,车道线/交通标志/车辆检测全流程
  • 可商用的 Logo 生成 AI 软件推荐|真实对比 + 商用案例实操