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

QT中connect高级链接——指针、lambda、宏

1、connect使用指针
connect(button,&QPushButton::released,this,&MainWidget::mySlot);  //【抬起】按钮button时,修改按钮b2的标题 

2、使用lambda表达式

引入lambda表达式,类似内联函数,可以用于不会被重用的短代码片段,不需要名称,不需要声明。当在 Qt 中配合信号一起使用时,lambda表达式的好处是不用定义槽函数

,也不用指定信号接收者,对于非被重复调用的槽函数起到精简代码的作用。

定义

[ capture list
 ] (parameters) -> return-type  
{   function body
} 

capture list说明

CaptureDescription
[]No capture; Lambda doesn't access any variables from the surrounding scope.
[var]Capture 'var' by value; Lambda has a copy of 'var' and can use it.
[&var]Capture 'var' by reference; Lambda refers to the original 'var'.
[=]Capture all local variables by value; Lambda has copies of all local variables.
[&]Capture all local variables by reference; Lambda refers to all local variables.
[this]Capture the 'this' pointer; Lambda can access the members of the current object.
[var, &other]Mix of capture modes; 'var' is captured by value, 'other' is captured by reference.
[=, &var]Mix of capture modes; 'var' is captured by reference, other variables are captured by value.

QT中槽函数

connect(&iperf_pro, &QProcess::readyReadStandardOutput, [&]() {QByteArray newData = iperf_pro.readAllStandardOutput();QString currentText = pnetperf_area->toPlainText();currentText += QString::fromLocal8Bit(newData);pnetperf_area->setPlainText(currentText);//pnetperf_area->append(QString(newData));});

lambda表达式开销

由于lambda将生成一个类,因此它的开销将与创建一个包含与捕获的变量数量相同的等效类一样。捕获的变量越多(特别是按值),生成的函数类就越大,使用lambda的成本也就越高。如果通过引用捕获,开销就是几个对应指针的大小。

如果没有捕获任何变量,则它实际上是一个函数调用。如果捕获一个变量,其代价与构造一个对象并直接在其上调用函数相同,而不需要进行虚拟查找。lambda的代价永远不会大于等效函数/类的代价。

connect(button,&QPushButton::released,  [button]()   
    // 在此处添加mutable关键字,代表传进来的变量可以被修改,不写该关键字则不能被修改  
   {  
        if(button->text()=="Lambda表达式") button->setText("表达式Lambda"); //修改按钮标题  
        else button->setText("Lambda表达式");                          //修改按钮标题  

        qDebug()<<"111111111"; //输出"111111111"  
        // qDebug()<<a<<b; //当方括号内包含变量a、b或为等号时,此处可以输出变量a、b的值  
    }  
    );  
// []代表把外部变量传进来,如果不传是不能被使用的  
// [button]代表把变量button传进来
// [=]代表把外部所有局部变量、类中所有成员以值的传递方式  
// [this]代表把类中所有成员以值的传递方式  
// [&]代表把外部所有局部变量引用,引用符号  
// int a=10,b=100;  
// ()第二个参数 函数的参数列表  

3、使用宏
connect(sender,SIGNAL(signal()),receiver,SLOT(slot()));
//由于使用宏并不会做错误检查,所以不建议使用

http://www.xdnf.cn/news/4527.html

相关文章:

  • 基于Qt的app开发第六天
  • 如何理解k8s中的controller
  • 缓存菜品-01.问题分析和实现思路
  • Carlink 技术:搭建汽车与手机的智能桥梁
  • GPAW安装流程——Ubuntu 系统(Python 3.8.10)
  • AI视觉质检的落地困境与突破路径
  • 工业现场ModbusTCP转EtherNETIP网关引领生物现场领新浪潮
  • gcloud 查看gke集群节点组是否开启了自动伸缩?
  • CAN报文逆向工程
  • node.js 实战——餐厅静态主页编写(express+node+ejs+bootstrap)
  • LangChain4j简介
  • Android开发-文本显示
  • 【2019 CWE/SANS 25 大编程错误清单】12越界写入
  • dubbo-token验证
  • 路由器WAN口和LAN口
  • 大数据技术全景解析:Spark、Hadoop、Hive与SQL的协作与实战
  • UE5 Audio2Face导出USD表情与ARKIT表情重定向
  • 嵌入式MCU语音识别算法及实现方案
  • 雨云游戏云MCSM面板服使用教程我的世界Forge服务端开服教程
  • 树上背包学习笔记
  • 小游戏(2)扫雷游戏
  • enum4linux:渗透测试中的Windows信息收割机!全参数详细教程!Kali Linux教程!
  • 探索开源大模型体系:当今AI的引领者
  • MySQL 主从配置超详细教程
  • 如何将C#程序打包成软件绿色包
  • python学习记录
  • 跨境电商合规新时代:亚马逊AHR风控系统深度解析与应对指南
  • Hacker kid: 1.0.1靶场渗透测试
  • 玛格丽特鸡尾酒评鉴,玛格丽特酒的寓意和象征
  • 巧用Ozon价格指数,发挥本土供应链优势提升商品竞争力